码迷,mamicode.com
首页 > 其他好文 > 详细

找出“1”的个数

时间:2015-05-04 17:15:13      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

 

  一、问题描述

  给定一个十进制的正整数,写下从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”的个数的结果在此累加,不断重复这个过程,注意要从低位开始计算,这样累加出来就可以得到正确的结果。

找出“1”的个数

标签:

原文地址:http://www.cnblogs.com/KaliLinux/p/4476302.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!