数“1”游戏

一、实验题目

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

     要求:

    1、写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5;

    2、在32位整数范围内,满足条件的“F(N)=n”的最大的N是多少;

二、设计思路

  规律:

     每一位上都只有三种情况:0,1,2-9

     第 i 位(个位算作第0位,十位算作第1位。。。。。):

     0:   Num/(10^(i+1))*(10^i)

     1:     Num/(10^(i+1))*(10^i)+Num%(10^i)+1;

     2-9:  (Num/(10^(i+1))+1)*(10^i)

三、核心源代码

 1 #include<iostream.h> 
 2 #include<math.h> 
 3 
 4 int shu1(int num)
 5 { 
 6     int flog=1;//标记计数1的位数(1为个位,10为十位) 
 7     int now=0;//当前位数
 8     int low=0;//较低位数 
 9     int high=0;//较高位数 
10     int count=0; 
11     
12     while(num/flog!=0)     
13     {
14         now=(num/flog)%10; 
15         low=num-(num/flog*flog); 
16         high=num/(flog*10); 
17         if(num<=0) 
18             return 0; 
19         if(0==now)//当前数字为0时计数 
20         {
21             count+=high*flog;    
22         }
23         else if(1==now)//当前数字为1时计数     
24         {
25             count+=high*flog+low+1;    
26         }
27         else    
28         {    
29             count+=(high+1)*flog;    
30         }
31         flog=flog*10;//数字左移一位    
32     }
33     return count;    
34 }
35 void main()
36 {
37     int num;
38     int max=0;
39     cout<<"请输入要测试的数值:";
40     cin>>num;
41     cout<<"出现“1”的个数为:"<<shu1(num)<<endl;    
42 }

四、程序截图:

五、实验总结

  在本次试验中,最主要的还是找到数“1”游戏中的规律,找到规律之后,代码程序也就豁然开朗了。

posted @ 2015-06-11 17:28  快乐的小菜鸟  阅读(212)  评论(0编辑  收藏  举报