zoukankan      html  css  js  c++  java
  • 《找出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)课下在查阅了相关资料以及汲取了老师上课的提示后,明了了如何解决问题以及编写代码了;

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

  • 相关阅读:
    洛谷P3406 海底高铁[差分 贪心]
    POJ3398Perfect Service[树形DP 树的最大独立集变形]
    POJ3928Ping pong[树状数组 仿逆序对]
    UVALive
    UVALive
    http协议进阶(二)URL与资源
    http协议进阶(一)HTTP概述
    http协议基础(十)实体首部字段
    http协议基础(九)响应首部字段
    http协议基础(八)请求首部字段
  • 原文地址:https://www.cnblogs.com/Twinklelittlestar/p/4547991.html
Copyright © 2011-2022 走看看