• 软件工程课堂练习--找“一”


    一、题目要求

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

    要求:

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

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

    二、设计思路

      通过列举,不难发现有如下规律

          1.一位十进制数:当N>=1时,f(N)=1;当N=0时,f(N)= 0;

      2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6;

              f(23)=个位出现1的个数+十位出现1的个数=3+10=13;

              ......

              f(93)=个位出现1的个数+十位出现1的个数=10+10=20;

      3.三位十进制数:f(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=(10+10)*1+(3+10)+24=57;

                                f(199)=...=(10+10)*2+100;

                                f(203)=...=(10+10)*2+1+100;

                                f(213)=...=(10+10)*2+(2+4)+100;

                                 ......

                                f(303)=...=(10+10)*3+(1)+100;

                                ......

      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;

    三、程序部分代码

    一下为计算1出现次数的部分代码

     1  while (n/factor!=0)       
     2     {
     3         LowerNum=n-(n/factor)*factor;
     4         CurNum=(n/factor)%10;
     5         HigherNum=n/(factor*10);
     6         switch (CurNum)
     7         {
     8         case 0:
     9             count=count+HigherNum*factor;
    10             break;
    11         case 1:
    12             count=count+HigherNum*factor + LowerNum +1;
    13             break;
    14         default:
    15             count=count+(HigherNum+1)*factor;
    16             break;
    17         }
    18         factor=factor*10;
    19     }
    20     return count;
    21 }

    四、截图

    五、实验总结

    根据老师的提示将数字分开看,分别看个位和十位..中“1”出现的次数,依次列举出来,很容易的就能找到规律

     

        

  • 相关阅读:
    LeetCode_4——寻找两个有序数组的中位数
    Java的CAS与ABA问题
    跨域问题解决
    解决git-for-windows官网下载速度慢的问题
    Java对观察者模式的支持
    Java动态代理
    设计模式七大原则
    UML中的类图关系
    布隆过滤器(Bloom Filter)与Hash算法
    Ubuntu16安装fabric1.4.4环境
  • 原文地址:https://www.cnblogs.com/caomeina/p/4474476.html
Copyright © 2020-2023  润新知