zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    js小案例---1.随机10不重复10数并排序2.一次输入10数并输出和
    23种设计模式-----转载
    类与类之间的关系-----转载
    设计模式六大原则-----转载
    配置JDK时环境变量path和JAVA_HOME的作用是什么?
    安装和配置JDK,并给出安装、配置JDK的步骤。
    1.Java为什么能跨平台运行?请简述原理。
    求圆的周长和面积
    java第一节课
    相关元素操作
  • 原文地址:https://www.cnblogs.com/xiangwo/p/4553392.html
Copyright © 2011-2022 走看看