软件工程课堂训练——有多少个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的规律。其实找规律的过称特别麻烦。中间有的经常漏掉。这样就走了不少弯路。后来仔细检查后,规律就出来了。有了规律,编程就很简单了。看来好的想法很重要。

原文地址:https://www.cnblogs.com/123jy/p/4467059.html