《找出1到正整数N中出现1的次数》

 

                                                                                      《找出1到正整数N中出现1的次数》

编程思想:依次求出正整数每个位数上出现1的次数,累加即可得到最后想要的结果;而每一位上出现1的个数与和它相邻的其它位数上的数字有关系(以此位置上的数为对称轴,其左边的所有数字作为其最高位,其右边的数字作为其最低位;当然若此位置已处于最低位或最高位,那么它对应的最低位或最高位置0),与它们有一个可求出1的固定的关系式(一个数各个位置上的数分离后,它们都对应着各个位置的基准,例如个位上的数对应的基准为1,以此类推即可),即若此位置上的数字为0,则在此位置上出现1的个数为最高位乘以基准;若为1,则等于最高位乘以基准加最低位再加1;若为其他,则为最高位加1乘以基准即可。即后,各个位上出现1的个数累加即可。

具体设计:(1)以4个变量high,m,low,f分别作为分离后当前位数的最高,本身,最低位以及分离其的基准;以while语句判断能进行进程的条件,只有当此数不越级别,才能继续进行,即在其中设置了一个判断终止的条件;

(2)依次按照个位,十位.......等等的顺序把各个位置上的数字分离出来,并以其为对称轴找出其最高位以及最低位:low=n-(n/f)*f;m=(n/f)%10;high=n/(f*10);

(3)用switch语句根据此位置上的数与最低,最高位上的数的固定关系式,依次累加计算每位上出现1的次数:switch(m){ case 0:count+=high*f; break; case1: count+=high*f+low+1;break;default:count+=(high+1)*f; break; }

(4)依次按照各位的基准把各位相应的出现的1的次数累加起来直至遇到终止的条件即可得到最终想要的结果。

源代码:

 

//找出1到正整数N中出现1的次数
//June 2th,2015
#include<iostream>
using namespace std;
long int f( long int n)
{

    long int low=0,high=0,m=0,f=1,count=0;
    while(n/f!=0)
    {
        low=n-(n/f)*f;
        m=(n/f)%10;
        high=n/(f*10);
        switch(m)
        {
        case 0:
            count+=high*f;
            break;
        case 1:
            count+=high*f+low+1;
            break;
        default:
            count+=(high+1)*f;
            break;
        }
        f*=10;
    }
    return count;

}
void main()
{
    int a,i=0;
    cout<<"请输入一个正整数:"<<endl;
    cin>>a;
    cout<<"f"<<"("<<a<<")"<<"="<<f(a)<<endl;
     long int m;
    cout<<"在32位整数中能找到符合要求的f(n)=n的最大数是:"<<endl;
    for(m=2147483647;m>=1&&i<1;m--)
    {
        if(f(m)==m)
        {
            cout<<m<<endl;
            i++;
        }
    }
}

 

 

 

实验结果截图:

 

编程总结:(1)当老师给出问题的时候,只是单纯混沌的举了一些不相干的例子,并没有从其中总结出什么规律;

(2)听了同学们的各抒己见,大多数还是不能满足老师想要的结果,继续思索中.......

(3)课下在查阅了相关资料以及汲取了老师上课的提示后,明了了如何解决问题以及编写代码了;

总之,多交流,多思考,多汲取别人的优点,多开拓视野是解决问题的必经之路!

 

posted @ 2015-06-02 23:11  Twinklelittlestar  阅读(365)  评论(0编辑  收藏  举报