• 软件工程课堂训练——有多少个1?


    一、题目要求

        给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

        要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。 

    二、设计思路

         列举几个数发现如下规律:

          1、一位数:N=0时,f(N)=0;N>0时,f(N)=1;

          2、两位数:f(13)=2+4=6;   f(23)=3+10=13

          3、三位数:f(113)=12+14+14=40

          ......

         4、 f(abcde),若要计算c位上1的个数,需看ab、c、de的情况。

            当c=0时,受高位影响,百位上出现1的个数为:(ab)*100

            当c=1时,受高位和低位影响,百位上出现1的个数为:(ab)*100+((cde)+1)

        当c>1时,受高位影响,百位上出现1的个数为:((ab)+1)*100
      

    三、程序代码

    // zhao111.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "stdlib.h"
    int CountNum(int n)
    {
        int count=0;
        int factor=1; 
        int LowerNum=0;
        int CurNum=0;
        int HigherNum=0;
        while (n/factor!=0)       
        {
            LowerNum=n-(n/factor)*factor;
            CurNum=(n/factor)%10;
            HigherNum=n/(factor*10);
            switch (CurNum)
            {
            case 0:
                count=count+HigherNum*factor;
                break;
            case 1:
                count=count+HigherNum*factor + LowerNum +1;
                break;
            default:
                count=count+(HigherNum+1)*factor;
                break;
            }
            factor=factor*10;
        }
        return count;
    }
    
    int main()
    {
         int num;
         printf("请输入一个数:");
         scanf("%d",&num);
         printf("%d中出现“1”的个数为:%d
    ",num,CountNum(num));
         return 0;
    }

    四、运行结果

      

    五、心得体会

     这个题老师也点出来重要的是找规律。所以我想分成几种情况考虑。这个数是一位的时候,2位十位是1,2,3,4.....时,三位百位是1,2,3,4.....时。然后又让找abcde的规律。其实找规律的过称特别麻烦。中间有的经常漏掉。这样就走了不少弯路。后来仔细检查后,规律就出来了。有了规律,编程就很简单了。看来好的想法很重要。

  • 相关阅读:
    《TZOJ1546》
    css3的基本样式
    PHP连接mysql数据库,并将取出的数据以json的格式输出
    使用ajax获取JSON数据的jQuery代码的格式
    使用构造函数来判断一个对象是数组还是日期
    js(jquery)代码在页面上实时地显示时间
    点分治总结
    线性基,高斯消元总结
    网络流总结
    后缀数组总结
  • 原文地址:https://www.cnblogs.com/123jy/p/4467059.html
Copyright © 2020-2023  润新知