打印从1到最大的n位数

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

思路

先找出最大值,然后遍历输出

public void print1ToMaxOfNDights1s(int n) {
	int number = 1;
	int i = 0;
	while (i++ < n) {
		number *= 10;
	}
	for (i = 1; i < number; i++) {
		System.out.print(i + " ");
	}
	System.out.println();
}

陷阱:n过大时是大数问题,不能简单用int或者long数据输出,需要采用字符串或者数组表达大数。

  1. 采用字符串模拟加法
//解决1 模拟加法
public void print1ToMaxOfNDigits02(int n) {
    if (n < 0) {
        return;
    }
    char[] number = new char[n];
    for (int k = 0; k < number.length; k++) {
        number[k] = '0';
    }
    while (!increment(number)) {//模拟加法
        printCharNumber(number);//打印
    }
}

private void printCharNumber(char[] number) {
    boolean isBeginning0 = true;
    for (int i = 0; i < number.length; i++) {
        if (isBeginning0 && (number[i] - '0') != 0) {//忽略前面的0
            isBeginning0 = false;
        }
        if (!isBeginning0) {
             System.out.print(number[i] - '0');
        }
    }
    System.out.println();
}

//对字符串进行加1操作,当number达到最大值后返回为true
//低位加1 到10进位
private boolean increment(char[] number) {
    int nTackOver = 0;//进位
    for (int i = number.length - 1; i >= 0; i--) {
        int nSum = (number[i] - '0') + nTackOver;
        // number[i]-'0'是把char转化为int,nTakeOver代表进位
        if (i == number.length - 1) {
            nSum++;
        }
        if (nSum >= 10) {
            if (i == 0) {
                return true;//超出范围
            }
            nTackOver = 1;
            nSum -= 10;
            number[i] = (char) (nSum + '0');
        } else {
            number[i] = (char) (nSum + '0');
            break;//高位不变跳出循环
        }
    }
    return false;
}
posted @ 2019-10-13 18:32  tangmeng  阅读(225)  评论(0编辑  收藏  举报