欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

打印1到最大的n位数(java)

程序员文章站 2024-03-15 22:08:18
...

题目:

输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。

思路:

(这个题看了半天才看懂书上的代码,/(ㄒoㄒ)/~~)

注意要考虑大数。

其中涉及到两个问题,一是大数的加1,二是大数的输出。

我用字符串来表示大数,进行处理。输出需要注意的是前边的0不能打印出来,例如09,要打印9.

大数加1,要考虑高低位进位。如果不进位的按正常的替换,>=10的时候要把低位变0,高位变1 。

代码:

import java.lang.*;

public class print {

	public void printNum(int n){
		if(n<=0) return;
		String num = new String("0");
		StringBuffer sb = new StringBuffer("");
		while(n-- > 0){
			sb.append("0");
		}
		while(!increment(sb)){
			printNum(sb);
		}	
	}
	public boolean increment(StringBuffer s){
		boolean isOverflow = false;
		int nTakeOver = 0;
		int nLength = s.length();
		for(int i=nLength-1 ; i>=0 ; i--){
			int nSum = s.charAt(i)-'0'+nTakeOver;
			if(i==nLength-1){
				nSum++;//低位加1
			}
			if(nSum>=10){
				if(i==0){//在高位的时候nSum>=10了,说明溢出了
					isOverflow = true;
				}
				else{//否则还没到,就进1
					nSum-=10;
					nTakeOver = 1;
					s.setCharAt(i, (char)('0'+nSum));
				}
			}else{//每位不到10的时候,直接替换
				s.setCharAt(i, (char)('0'+nSum));
				break;
			}
		}
		return isOverflow;
	}
	public void printNum(StringBuffer s){
		boolean isBegin0 = true;
		int nLength = s.length();
		for(int i=0 ; i<nLength ; i++){
			if(isBegin0&&s.charAt(i)!='0')
				isBegin0 = false;
			if(!isBegin0){
				System.out.print(s.charAt(i));
			}
		}
		System.out.println();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		print p =new print();
		p.printNum(20);
	}

}
把问题换成数字排列的解法,递归简化代码

public class print1 {

	public static void Print1ToMaxOfNDigits_3(int n){
        if(n < 0){
            return;
        }
        StringBuffer s = new StringBuffer(n);
        for(int i = 0; i < n; i++){
            s.append('0');
        }
        for(int i = 0; i < 10; i++){

            s.setCharAt(0, (char) (i+'0'));
            Print1ToMaxOfNDigits_3_Recursely(s, n, 0);
        }

    }
    public static void Print1ToMaxOfNDigits_3_Recursely(StringBuffer s, int n , int index){
        if(index == n - 1){
            PrintNumber(s);
            return;
        }

        for(int i = 0; i < 10; i++){
            s.setCharAt(index+1, (char) (i+'0'));
            Print1ToMaxOfNDigits_3_Recursely(s, n, index+1);
        }
    }
    public static void PrintNumber(StringBuffer s){
        boolean isBeginning0 = true;
        for(int i = 0; i < s.length(); i++){
            if(isBeginning0 && s.charAt(i) != '0'){
                isBeginning0 = false;
            }
            if(!isBeginning0){
                System.out.print(s.charAt(i));
            }
        }

        System.out.println();
    }
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		print1 p = new print1();
		p.Print1ToMaxOfNDigits_3(3);
	}

}