一:题目
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:(1) 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。
(2)在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二:设计思路
首先对于第一个问题,根据王老师的提示,想到计算出每个个十百千位上各出现几次1相加即可,考虑各个位上的数等于0,1以及大于1三种情况即可找到规律。
三:代码
1 #include2 using namespace std; 3 4 int geshu(int value) 5 { 6 int a,b,c,d,e,a1,b1,c1,d1,e1,sum; 7 a=0;b=0;c=0;d=0;e=0; 8 a=value%10; 9 b=value/10;10 b=b%10;11 c=value/100;12 c=c%10;13 d=value/1000;14 d=d%10;15 e=value/10000;16 cout<<"各位上的数字分别为:"< <<" "<<<" "< <<" "< <<" "< >value;54 while(value<0||value>=100000)55 {56 cout<<"请重新输入:";57 cin>>value;58 }59 sum=geshu(value);60 cout< <<"1的个数为:"< <
四:实验截图
五:总结
对于这种数的计算很多都是查找规律,只要找到一个规律突破点那么这个题目迎刃而解,遇到这种情况先列举几个简单而又特殊的例子通过例子找规律,这样就会变得容易的多。