课堂练习之找数字0-N中“1”出现的次数

一、题目与要求

题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

要求:1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12) = 5。

   2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

二、设计思路

第一种思路:

模10,除10取余,然后寻找规律,

9%10=9、9/10=0;

11%10=1、11/10=1;

15%10=5、15/10=1;

······

然后写了很多,想到如果模10等于0怎么办?等于1怎么办?取余怎么办,判断条件怎么写?

捣鼓了好长时间没有弄明白。

第二种思路(老师上课讲的思路):

f(13)=2+4=6

f(23)=3+10=13

f(33)=4+10=14

f(93)=10+10=20
……
某一位上1的个数与其位上的数字、其高一位上的数字、其低一位上的数字数字有关,最后编程实现如下:
三、源代码
 1 //hanxuedong

 2 

 3 #include<iostream.h>

 4 int Count(int n)

 5 {  

 6     int count=0;  //对1的个数计数

 7     int now=1;    //N由最低位到最高位此时对应第now位

 8     int l=0;      //第now位的低一位的数字

 9     int nownum=0; //第now位的数字

10     int h=0;      //第now位的高一位的数字

11     if(n<=0)

12     {  

13         return 0;  

14     }  

15     while(n/now!=0)

16     {  

17         l=n-(n/now)*now;   

18         nownum=(n/now)%10;  

19         h=n/(now*10);  

20         if(nownum==0) 

21         {  

22             count+=h*now;  

23         }  

24         else if(nownum==1)

25         {  

26             count+=h*now+l+1;  

27         }  

28         else

29         {  

30             count+=(h+1)*now;  

31         }  

32         now*=10; 

33     }  

34     return count;  

35 }  

36 void main()

37 {

38     int number;

39     cout<<"请输入数字:";

40     cin>>number;

41     cout<<"0--"<<number<<"中1出现的次数为:"<<Count(number)<<endl;

42 }

四、运行结果

课堂练习之找数字0-N中“1”出现的次数

课堂练习之找数字0-N中“1”出现的次数

课堂练习之找数字0-N中“1”出现的次数

五、心得体会

像这一类的题目,找到规律很重要,找到规律就对代码实现以及代码优化就会有很大的帮助,面对不要急着上来就写代码,一定要先在下边动手写写,寻找以下规律。

你可能感兴趣的:(数字)