1的个数

1.题目:

给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
1.写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。
2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

2.实现思路:

  1.分别统计1-N所有数字的个位、十位、百位、千位和万位上面1的个数。如下图所示。个位上的1用表示,十位上的1用表示,百位上的1用表示。

      

2.各个位上1的个数通过公式计算得出。

3.下面介绍计算的方法:

1.随意给定一个数字N,

2.首先分解得出各个位上的数字,这里假设个、十、百、千、万位上的数字分别为a,b,c,d,e.

   若1-N所有数字个位上1的个数为a1.则

    

   若1-N所有数字个位上1的个数为b1.则

    其他同理……

4.源代码:

#include<iostream>
using namespace std;

int geshu(int value)
{
    int a,b,c,d,e,a1,b1,c1,d1,e1,sum;
    a=0;b=0;c=0;d=0;e=0;
    a=value%10;
    b=value/10;
    b=b%10;
    c=value/100;
    c=c%10;
    d=value/1000;
    d=d%10;
    e=value/10000;
    cout<<"各位上的数字分别为:"<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e;
    if(a==0)
        a1=b*1+c*10+d*100+e*1000;
    else
        a1=1+b*1+c*10+d*100+e*1000;
    if(b==0)
        b1=c*10+d*100+e*1000;
    else if(b==1)
        b1=a+1+c*10+d*100+e*1000;
    else
        b1=10+c*10+d*100+e*1000;
    if(c==0)
        c1=d*100+e*1000;
    else if(c==1)
        c1=a+1+b*10+d*100+e*1000;
    else
        c1=100+d*100+e*1000;
    if(d==0)
        d1=e*1000;
    else if(d==1)
        d1=a+1+b*10+c*100+e*1000;
    else
        d1=1000+e*1000;
    if(e==0)
        e1=0;
    else if(e==1)
        e1=a+1+b*10+c*100+d*1000;
    else
        e1=10000;
    sum=a1+b1+c1+d1+e1;
    return sum;
}

void main()
{
    int value,sum;
    cout<<"请输入一个整数:";
    cin>>value;
    while(value<0||value>=100000)
    {
        cout<<"请重新输入:";
        cin>>value;
    }
    sum=geshu(value);
    cout<<endl<<"1的个数为:"<<sum<<endl;
}

5.实验结果截图

原文地址:https://www.cnblogs.com/bdqczhl/p/4550653.html