给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
看到这个题时第一感觉就是可以用最基本的方法通过遍历的来找出1出现的次数,但是我们可以从这里面找出其中的规律,一个数中含有1的个数为个位出现的次数、十位出现的次数、百位出现的次数的和的总个数;通过分析可以知道如果是一位数则个位出现的次数只有两种情况0和1,如果是两位数十位不是0那么个位出现1的次数是十位上的数加1,十位上出现1的次数与十位上的数字有关如果十位上是1则出现的次数是个位上数字加1,如果大于一则出现10次。可以看出每一位出现1的次数与高位,低位和本身有一定的关系。通过总结可以得到,十进制数abcde计算百位上(c)出现1的次数,如果百位上是0,则百位上出现1的次数是(ab)*100,如果百位上是1,则百位上出现1的次数是(ab)*100+cde+1,如果百位上数字大于1.则百位上出现1的次数是(ab+1)*100。
#include <iostream.h> int find(int num) { int count=0;//定义一个存储1的个数的变量 int temp;//定义一个缓存的变量 for(int i=1;i<=num;i++) { temp=i; while(temp!=0) { if(temp%10==1) { count++; } temp=temp/10; } } return count; } int main(void) { int num1; cout<<"请输入数:"; cin>>num1; cout<<"包含1的个数是:"<<find(num1)<<endl; return 0; }
四、结果截图
五、总结
通过本次练习,我明白了编程思想的重要性,你要想把一个程序写好,不管是大是小,你都要有一个好的思路去解决这个问题,当你想到一个方案时,不要高兴的太早,你要去想一想还有没有更好的方法来解决该问题,或者怎么去优化现在的方案,这些都会是问题变得简单明了起来!
原文:http://www.cnblogs.com/hushunli/p/4469730.html