题目:
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12) = 5。
2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
一、设计思路
因为是找从1到n中1出现的次数的总和,所以比较笨的方法是采用循环从1到n,一位一位的找出1出现的次数,并做统计。可以利用10来做处理,以达到一位一位减少的目的。(这可能不是老师想要的思路,但别的思路没能想出来,编程实现的话只能先用这个思路了)
二、源代码
1 #include<iostream.h> 2 void main() 3 { 4 int i,num,count=1,a; 5 cout<<"请输入数字:"; 6 cin>>num; 7 if(num==1) 8 { 9 count=1; 10 } 11 else 12 { 13 for(i=1;i<num;i++) 14 { 15 a=i; 16 while(a!=0) 17 { 18 if(a%10==1) 19 { 20 count++; 21 } 22 a=a/10; 23 } 24 } 25 } 26 cout<<"1出现的次数:"<<count<<endl; 27 }
三、结果截图
四、实验总结
这次主要是找规律,但自己没能耐下心来去发现,通过观察同学们写的博客,找到规律便不需要再遍历,大大增加了运算的速度。不得不说找规律也需要很多技巧,明显这方面我的经验还不足,以后要多加训练,希望下次遇到类似问题能找到更好的方法。