考察点
大数问题
知识点
题目
分析
这道题目唯一需要考虑的点就是n很大的时候会存在数字溢出的情况,因此这种肯定属于大数问题,大数问题就是用字符串表示数字。题目要求从1打印到最大的n位十进制数,其中必不可少的运算就是加法和打印,只要想一想我们普通加法是如何实现的,这个算法不难实现
public class Twelve {
public static void main(String[] args) {
printMaxNum(3);
}
public static void printMaxNum(int num) {
if (num <= 0) {
return;
}
String[] numStr = new String[num];
for (int i = 0;i < num;i++) {
numStr[i] = "0";
}
while(!add(numStr)) {
printNum(numStr);
}
}
public static boolean add(String[] numStr) {
int len = numStr.length;
int carry = 0;
boolean maxFlag = false;
for (int i = len - 1;i >= 0;i--) {
int val = Integer.parseInt(numStr[i]) + carry;
//末尾每次都加1
if (i == len - 1) {
val++;
}
//这里是10的时候说明需要进1位,因此不跳出循环继续处理前一位
if (val == 10) {
//i=0的时候说明已经加到(n+1)位了,因此需要结束加法循环
if (i == 0) {
maxFlag = true;
}
val -= 10;
numStr[i] = String.valueOf(val);
carry = 1;
} else {
//没有进位的情况,每次加完1打印一次,直接跳出循环
numStr[i] = String.valueOf(val);
break;
}
}
return maxFlag;
}
public static void printNum(String[] numStr) {
boolean beginFlag = false;
int len = numStr.length;
for (int i = 0;i < len; i++) {
if (!beginFlag && !numStr[i].equals("0")) {
beginFlag = true;
}
if (beginFlag) {
System.out.print(numStr[i]);
}
}
System.out.println();
}
}