• 课堂练习——寻找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;
    
    }

    四、结果截图

    五、总结

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

  • 相关阅读:
    ASP.NET中常用的优化性能的方法
    把WinDbg集成到Visual Studio中
    提高ASP.net的性能
    Msn Library
    [转帖]OutOfMemoryException问题的处理
    一完美的关于请求的目录不存在而需要url重写的解决方案!
    在 ASP.NET 中执行 URL 重写
    转 内存不断上升处理方法
    IIS 6 通配符应用映射和HttpHandler配置
    Java开源
  • 原文地址:https://www.cnblogs.com/hushunli/p/4469730.html
Copyright © 2020-2023  润新知