标签:
一、问题描述
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。
在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二、设计思路
对于计算一个给定正整数中“1”的个数,我采用的是通过计算一个给定数值的个位、十位、百位...分别包含多少个“1”,然后将其累加,这样可以计算出结果,当然还会有很多其他的方法。
三、代码
1 #include <iostream>
2 using namespace std;
3
4 int Count(int num)
5 {
6 int count,mul,num1,num2,num3;
7 count=0;
8 mul=1; //除数 用来将各位分别分解出来
9 num1=num2=num3=0;
10 while(num/mul)
11 {
12 num1=num-(num/mul)*mul;
13 num2=(num/mul)%10; //当前位数上的数字
14 num3=num/(mul*10); //前一位上的数字
15 switch(num2) //若正整数为abc,b为当前位数
16 {
17 case 0: //余数为0时,包含a*mul个1;
18 count+=num3*mul;
19 break;
20 case 1: //余数为1时,包含a*mul+c+1;
21 count+=num3*mul+num1+1;
22 break;
23 default: //其余>1的情况都是(a+1)*mul
24 count+=(num3+1)*mul;
25 break;
26 }
27 mul*= 10;
28 }
29 return count;
30 }
31 int main(int argc, char* argv[])
32 {
33 int number,ones;
34 cout<<"请输入一个正整数:";
35 cin>>number;
36 ones=Count(number);
37 cout<<"该数值中“1”的个数为"<<ones<<endl;
38 return 0;
39 }
四、运行结果
五、心得体会
在计算当前位数中包含1的个数的时候,不但要考虑该位的数值情况,还要考虑该位的高一位(如果存在的话),并将该位的低位“1”的个数的结果在此累加,不断重复这个过程,注意要从低位开始计算,这样累加出来就可以得到正确的结果。
标签:
原文地址:http://www.cnblogs.com/KaliLinux/p/4476302.html