找“1”

题目:

给定一个十进制的正整数,写下从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 }

三、结果截图

四、实验总结

    这次主要是找规律,但自己没能耐下心来去发现,通过观察同学们写的博客,找到规律便不需要再遍历,大大增加了运算的速度。不得不说找规律也需要很多技巧,明显这方面我的经验还不足,以后要多加训练,希望下次遇到类似问题能找到更好的方法。

原文地址:https://www.cnblogs.com/gaoyang110/p/4474518.html