找一

1.题目:

  • 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
  • 要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。

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

2.设计思路:

课上对于3,13,23,33,43,53,63,73,83,93,103,。。。求解其中1的个数,通过特殊数总结一般规律,进而求得f(N),从而编程实现。

推广:若abcde表示任意位数的整数,对其中c位进行总结,那么:

  • 若c=0,则c位为1的个数为ab*(c位);
  • 若c=1,则c位为1的个数为ab*(c位)+de+1;
  • 若c>0,则c位为1的个数为(ab+1)*(c位);

3.源代码:

 1 #include<iostream.h>
 2 #include "stdlib.h"
 3 int CountNum(int n)
 4 {
 5     int count=0; 
 6     int factor=1; 
 7     int LowerNum=0;
 8     int CurNum=0;
 9     int HigherNum=0;
10     while (n/factor!=0)       
11     {
12         LowerNum=n-(n/factor)*factor;
13         CurNum=(n/factor)%10;
14         HigherNum=n/(factor*10);
15         switch (CurNum)
16         {
17         case 0:
18             count=count+HigherNum*factor;
19             break;
20         case 1:
21             count=count+HigherNum*factor + LowerNum +1;
22             break;
23         default:
24             count=count+(HigherNum+1)*factor;
25             break;
26         }
27         factor=factor*10;
28     }
29     return count;
30 }
31 
32 int main()
33 {
34     int num;
35     cout<<"请输入数字:
";
36     cin>>num;
37     cout<<"
";
38     cout<<num<<"中出现数字1的个数为:
";
39     cout<<CountNum(num)<<endl;
40     return 0;
41 }

4.结果截图:

5.心得体会:

通过特殊找一般,是编程乃至解决生活中大部分问题的常用方法,运用这一方法,相信对以后编程开发更有帮助吧。

原文地址:https://www.cnblogs.com/zhengt/p/4470334.html