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.心得体会:
通过特殊找一般,是编程乃至解决生活中大部分问题的常用方法,运用这一方法,相信对以后编程开发更有帮助吧。