• n以内的1的个数


    import java.util.Scanner;
    
    
    public class main {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int num;
    		Scanner in = new Scanner(System.in);
    		num=in.nextInt();
    		int x=0,y=1;
    		int a,b,c;
    		while(num>=y)
    		{
    			a=num/(10*y);
    			c=(num/y)%10;
    			if(y==1)
    				b=0;
    			else
    				b=num%y;
    
    			if(c==0)
    				x+=a*y;
    			else if(c==1)
    				x+=a*y+1+b;
    			else
    				x+=(a+1)*y;
    			System.out.println(+a+"  "+c+"  "+b+"  "+x);
    			y=y*10;
    		}
    
    	}
    
    }
    

    结果截图解释:每行依次向下分别为将个位,十位,百位,千位......分离出来得到的结果,每一行的四个数分别代表当前位数前面的数,当前位上的数,当前位上后面的数,加到当前位时一共加到的1的和,由于个位没有后面的数,最高位上没有前面的数,所以都赋值为0。

    思路:将一个数以内的1的个数写成各位上1的个数相加的形式,就可以得到规律:所有的1的个数即为每位上出现的1的个数的和,而每位上1的个数为:当当前位上的数等于0时,1的个数是前面的数乘以当前位10,100,或1000;当当前位上的数等于1时,1的个数为数乘以当前位10,100,或1000再加上后面面的数再加1;当当前位上的数大于1时,1的个数为前面的数加1再乘以当前位!

    如:1234的十位

    将是位上的数分离出来后得到的前位数前面的数,当前位上的数,当前位上后面的数分别为:12   3    4

    由于3>1,十位上的1的个数为:(12+1)*10=130;

    若是1214的十位

    将是位上的数分离出来后得到的前位数前面的数,当前位上的数,当前位上后面的数分别为:12   1    4

    由于3==1,十位上的1的个数为:12*10+4+1=125;

    若是1204的十位

    将是位上的数分离出来后得到的前位数前面的数,当前位上的数,当前位上后面的数分别为:12   0    4

    由于3==0,十位上的1的个数为:12*10=120。

  • 相关阅读:
    React 组件的生命周期方法
    Ant Design 错误记录与常用例子
    roadhog中如何拷贝文件
    API加密框架monkey-api-encrypt发布1.2版本
    必杀技:当报错信息看不出原因时,怎么办?
    当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花
    Kitty-Cloud服务搭建过程剖析
    Maven快照版本要这样用才真的香!
    Kitty-Cloud环境准备
    双剑合璧的开源项目Kitty-Cloud
  • 原文地址:https://www.cnblogs.com/xiangwo/p/4553392.html
Copyright © 2020-2023  润新知