课堂练习——寻找1出现的次数

一、题目要求

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

}

四、结果截图

五、总结

通过本次练习,我明白了编程思想的重要性,你要想把一个程序写好,不管是大是小,你都要有一个好的思路去解决这个问题,当你想到一个方案时,不要高兴的太早,你要去想一想还有没有更好的方法来解决该问题,或者怎么去优化现在的方案,这些都会是问题变得简单明了起来!

原文地址:https://www.cnblogs.com/hushunli/p/4469730.html