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


    一、题目:

    n给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
    n要求:
    n写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。
    n在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
    二、解题思路:
    无。
    三、程序源码:
    import java.util.*;
    public class main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int num;
            Scanner S=new Scanner(System.in);
            System.out.print("请输入数字:");
            num=S.nextInt();
            System.out.print(num+"中出现数字1的个数为:");
            System.out.println(Count(num));
            for(int i=32767;i>0;i++)
            {
                if(Count(i)==i)
                {
                    System.out.print("满足条件的“f(N) =N”的最大的N是"+i);
                    break;
                }
            }
        }
        static int Count(int n)
        {
            int count=0; 
            int factor=1; 
            int LowerNum=0;
            int CurNum=0;
            int HigherNum=0;
            while (n/factor!=0)       
            {
                LowerNum=n-(n/factor)*factor;
                CurNum=(n/factor)%10;
                HigherNum=n/(factor*10);
                switch (CurNum)
                {
                case 0:
                    count=count+HigherNum*factor;
                    break;
                case 1:
                    count=count+HigherNum*factor + LowerNum +1;
                    break;
                default:
                    count=count+(HigherNum+1)*factor;
                    break;
                }
                factor=factor*10;
            }
            return count;
        }
    
    
    }

    四、程序运行截图:

    五、个人总结:

         这次程序自己首先想到的是把1—N的每个数里边的1数一遍。但这不是最有效的办法,自己想的方法又实现不出来,在网上找了好多资料,只有上面的这种方法自己可以理解,因此就抄袭了下来。这个程序是根据如下规律写出来的:

         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的个数=13+20+24=57;    
       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
    自己理解的不是很到位,但是可以明白基本的意思,对自己无语。
  • 相关阅读:
    no-useless-call (Rules) – Eslint 中文开发手册
    Java 8 Stream
    CSS3 ,checked 选择器
    MySQL 数据类型
    _Alignas (C keywords) – C 中文开发手册
    C 库函数 – modf()
    JavaScript E 属性
    SyntaxError.prototype (Errors) – JavaScript 中文开发手册
    swagger和openAPI: 上传文件
    Java中HashMap的putAll()方法: HashMap.putAll()
  • 原文地址:https://www.cnblogs.com/fengyutongxing/p/4552770.html
Copyright © 2020-2023  润新知