打印1到最大的n位数
输入3,就打印1-999的所有数
思路一:
找到10的n次方,利用for循环打印从1-10^n
但是这样是不行的,如果数字一旦超过long 就会溢出
思路二:
用一个n位的字数组来模拟十进制加法,实现进位;
数组是a[0],a[1],a[2]…index 0 用来表示个位,
所以打印的时候得从数组的后面打。
public static void max(int n){
char str[] = new char[n];
for(int i = 0;i<n;i++){//初始化字符数组
str[i] = '0';
}
for(int i = n-1;i>=0;i--) {//开始计算
while(str[i]!='9'){
int m =0;
str[m]++;
while(str[m]>'9'&&m<n-1){
str[m]='0';
str[m+1]++;
m++;
}
print(str);
}
}
}
private static void print(char[] str) {
int m =str.length-1;
while(str[m]=='0'){
m--;
}
for(int i = m;i>=0;i--){
System.out.print(str[i]);
}
System.out.println();
}
public static void main(String[] args) {
// new Max().printToMax1(1);//大数就越界
max(3);
}
特别要强调一下以下代码
A: for(int i = n-1;i>=0;i--) {//开始计算
B: while(str[i]!='9'){
int m =0;
str[m]++;
C: while(str[m]>'9'&&m<n-1){
str[m]='0';
str[m+1]++;
m++;
}
print(str);
}
A处的for循环控制的是打印最高为九的这些数
举个例子 n = 3 时,i = n-1开始第一次for循环打印的就是1~900
如果你把循环条件改为 for(int i = n-1;i>=n-1;i–) 只循环一次
就会发现打印到 900 他就不打印了,因为Bwhile循环控制了加法的终点,只要str【i】==9就开始下一个for循环,
下一次打印的就是1~990,其实就是打了99个数,
下面的whileC 设计的很巧妙,他是进位功能,那个最后的m++看似没有用,因为m++完了上面又m = 0;实则有用
如果数字为499,这样个位进位,进入C:while 之后m++,十位也要进C:while 这样就进位了,如果两个相邻的位数前一个为9
或者都没有进位的趋势短期内,那个m++就会误以为没有用,理解起来很困难
这样就完成了