找1

一、题目:

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

要求:

  写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5;

  在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少?

二、思路:

根据老师在课上提供的思路,有以下的思路:

f(3)=1

f(13)=(1+1)+4  f(23)=(2+1)+10  f(33)=(3+1)+10  ….   f(99)=(9+1)+10

f(103)=(10+1)+10+4     f(113)=(11+1)+(13+1)+14   f(123)=(23+1)+(12+1)+20  …   f(193)=(93+1)+(19+1)+20

三、代码

#include <iostream.h>   

int f(int num) 

    int sum=0; 

    int factor=1;  

    int lower=0; 

    int now=0; 

    int higher=0; 

    while(num/factor!=0) 

    { 

        lower=num-(num/factor)*factor; 

        now=(num/factor)%10; 

        higher=num/(factor*10); 

        switch(now) 

        { 

            case 0: 

            sum+=higher*factor; 

            break; 

            case 1: 

            sum+=higher*factor+lower+1; 

            break; 

            default: 

            sum+=(higher+1)*factor; 

            break; 

        } 

        factor*=10; 

    } 

    return sum; 

}  

四、截图

五、总结

老师出题的重点是思路,思路是有了,但是编程的时候感觉好费力,参考了多位同学的成果,基础太不扎实了。

原文地址:https://www.cnblogs.com/lsfh/p/4474784.html