统计重1到n的澳门美高梅官方网站中1的个数 – 初日

成绩:

假设单独阿拉伯数字零碎澳门美高梅官方网站N,从1开端记下来。,每个人整数到n,因此计算每个人1的数字。。

譬如:
N= 2,记下1,2。孤独地11呈现。。

N= 12,笔者将记下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。左右,1的数字是5。。

成绩一:

写应变量f(n),从1归来到1。,譬如,F(12) 5。

解决一:

笔者率先忆及的是:遍历1~N,计数每数字1数量。,附加占每个人数字的1。。

 1 #include
 2 #include
 3 #include<string.h>
 4longlongint Count(longlongint n){
 5longlongint count = 0;
 6while(n){
 7         count += (n % 10 == 1)?1:0;
 8         n = n / 10;
 9    }
10return count;
11}
12int main()
13{
14longlongint n,i,count;
15while(斯坎夫"%lld",&n) != EOF)
16         count = 0;
17for(i = 1;i <= n;i++){
18             count += 伯爵(一)
19        }
20         printf("%lld\n",伯爵)
21    }
22return0;
23 }

这种方法宽裕的故意的。,但这不是单独扭吗?。致命的成绩是效力成绩。。假设假设的n充分大,计算总算需求许久。。

蓝图二:

辨析整洁。

<1>1位数位置

这么地简略,假设n = 3,每个人数字从1到3:1,2,3,孤独地单独数字呈现1。,孤独地一次。。可以找到,n是单独数字。,N >=1,这么f(N)= 1;N = 0,f(N)= 0;

<2>2位数位置

<3>3位数位置

4位数的恒等的辨析,5位数。。。。。

设N = abcde ,朝内的,ABCDE是阿拉伯数字零碎零碎说得中肯数字。。

假设你想找出前1的次数,它将受到3个素质的支配。:100位数字,一百位数(低)数。,上(上)位的数字。

假设数字是0。,超越1的少许数可以被决议。。譬如:12013,你可以了解100个人中有1个能够是。:100~199,1100~1199,2100~2199,,………,11100~11199,总社会团体1200个。。可以看出,这么地决议是由单独高级的的数字(12)作出的。,而且发展成为高级的的数字(12)次。 电流数字(100)。

假设数字是1。,超越1的少许数不只会受到高级的的程度的支配。。譬如:12113,可以看出,数百人受到高震动的支配。:100~199,1100~1199,2100~2199,,………,11100~11199,总社会团体1200个。。同上。,而且发展成为高级的的数字(12)次。 电流数字(100)。但同时,也受到低位的支配。,100人中有1人:12100~12113,总共114个,发展成为低数位(113) 1。

假设少许数大于1(2~9)。,孤独地1位的100位数字将由高级的的程度来决议。,譬如,12213,则100人中有1人:100~199,1100~1199,2100~2199,………..,11100~11199,12100~12199,一社会团体1300个。,而且发展成为高级的位数字+1(12+1)乘以电流数字(100)。

 1/*N = abcde 100位数是C.。
 2以100人中仅有1报酬例。。
 3*/ 4int count = 0;
 5//数字是0。,超越1的少许数可以被决议。 6if(c == 0){
 7//发展成为高位(AB) 电流数字(100) 8     count += ab*100;
 9}
10//数字是1。,超越1的少许数不只会受到高级的的程度的支配。11elseif(c == 1){
12//高位数字(AB) *  电流数字(100) + 低数位(DE)  113     count += ab*100 + de + 1;
14}
15//少许数大于1(2~9)。,100位数字说得中肯1位是由高级的的程度决议的。16else{
17//(高数字  1(AB   1) 电流数字(100)18     count += 对称体 + 1) * 100;
19 }
 1 #include
 2 3longlongint Count(longlongint n){
 4//1的数字 5longlongint count = 0;
 6//电流位 7longlongint Factor = 1;
 8//低位数 9longlongint LowerNum = 0;
10//电流数字字11longlongint CurrNum = 0;
12//高位数字13longlongint HigherNum = 0;
14if(n <= 0){
15return0;
16    }
17while(n / Factor != 0){
18//低位数19         LowerNum = n - (n / 素质) * Factor;
20//电流数字字21         CurrNum = (n / 素质) % 10;
22//高位数字23         HigherNum = n / (素质) * 10);
24//假设是0,1的次数是由由低到高决议的。25if(CurrNum == 0){
26//发展成为高数位 * 电流数字27             count += HigherNum * Factor;
28        }
29//假设是1,1的次数由高点和低点决议。30elseif(CurrNum == 1){
31//高位数字 * 电流数字 + 低位数 + 132             count += HigherNum * Factor + LowerNum + 1;
33        }
34//假设超越1,1的次数是由由低到高决议的。35else{
36//(高数字  1) 电流数字37             count += (HigherNum + 1) * Factor;
38        }
39//顺着一40         Factor *= 10;
41    }
42return count;
43}
4445int main(){
46longlongint a;
47while(斯坎夫"%lld",a) != EOF)
48         printf("%lld\n",伯爵(a)
49    }
50return0;
51 }

转载:

发表评论

电子邮件地址不会被公开。 必填项已用*标注