软件工程课堂练习--找“一”

一、题目要求

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

要求:

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

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

二、设计思路

  通过列举,不难发现有如下规律

      1.一位十进制数:当N>=1时,f(N)=1;当N=0时,f(N)= 0;

  2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6;

          f(23)=个位出现1的个数+十位出现1的个数=3+10=13;

          ......

          f(93)=个位出现1的个数+十位出现1的个数=10+10=20;

  3.三位十进制数:f(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=(10+10)*1+(3+10)+24=57;

                            f(199)=...=(10+10)*2+100;

                            f(203)=...=(10+10)*2+1+100;

                            f(213)=...=(10+10)*2+(2+4)+100;

                             ......

                            f(303)=...=(10+10)*3+(1)+100;

                            ......

  4.f(abcde),计算c位上的1的个数,需要看ab、c、de的情况:

    当c=0时,受高位影响,百位上出现1的个数为:(ab)*100;

    当c=1时,受高位和低位影响,百位上出现1的个数为:(ab)*100+((cde)+1);

    当c>1时,受高位影响,百位上出现1的个数为:((ab)+1)*100;

三、程序部分代码

一下为计算1出现次数的部分代码

 1  while (n/factor!=0)       
 2     {
 3         LowerNum=n-(n/factor)*factor;
 4         CurNum=(n/factor)%10;
 5         HigherNum=n/(factor*10);
 6         switch (CurNum)
 7         {
 8         case 0:
 9             count=count+HigherNum*factor;
10             break;
11         case 1:
12             count=count+HigherNum*factor + LowerNum +1;
13             break;
14         default:
15             count=count+(HigherNum+1)*factor;
16             break;
17         }
18         factor=factor*10;
19     }
20     return count;
21 }

四、截图

五、实验总结

根据老师的提示将数字分开看,分别看个位和十位..中“1”出现的次数,依次列举出来,很容易的就能找到规律

 

    

原文地址:https://www.cnblogs.com/caomeina/p/4474476.html