一、题目要求
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12) = 5。
在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
要求将设计思想、代码实现、实现截图、个人总结以博文的形式发表。
(截止日期2015-4-30晚18:00)
二、设计思想
首先得列出当N为1~AB(2=<A=<9)以内时,各种情况十位与个位“1”的个数,可以肯定十位的“1”与个位数上的“1”有关,即十位上“1”为B-0+1,个位上“1”与十位上数有关,即个位上“1”为A-0+1,所以用一个count变量记住“1”的个数。
三、代码
#include<iostream.h>
int main()
{
int count=0,i,N,temp;
cout<<"请输入N的值:";
cin>>N;
for(i=1;i<=N;i++)
{
temp=i;//记录i的值
while(temp!=0)
{
count+=(temp%10==1)?1:0;
temp/=10;//直接用i的话,i最后变为0,++的话变为1,死循环了
}
}
cout<<count<<endl;
return 0;
}
四、截图
当N=101时,百位上“1”有2个,十位上“1”有10个,个位上“1”有11个,总共23个
五、总结
这个题目与以前题目都有一个相似之处,就像以前求读者买一批书的最低价格题目,都得找出一些数范围的各种联系或者规律,
再设计算法就好解决了,总之找规律很重要特别是这种需要技巧的程序设计题,技巧很重要。但是切记不是任何题目都有技巧,
所以特定题目特定考虑,找到最优算法。