问题描述
输入数字n,按顺序打印出从0到最大的n位十进制数。比如输入4,则需要输出0,,1,2,3,···, 9999
思路
需要注意两点:
- 直接使用int或long类型,当n比较大时会溢出
- 如何快速的判断出到达了最大的n位数
为解决第一点,我们需要使用字符串模拟加法,这样就不会溢出。第二点快速判断到达最大n位数,只需要我们对每次进位位进行判断,看进位位是否是最高位,如果是表示已经到了最大n位数。
代码实现
思路一:直接使用字符串模拟每次+1操作
public class Main {
public static void main(String[] args) {
int n=4;
char[] ch = new char[n];
for(int i=0;i<n;i++){
ch[i] = '0';
}
add_1(ch);
}
/**
* 模拟加法
*/
public static void add_1(char[] ch){
// 当到达最大n位数时跳出
while(true){
// 个位进行0-9依次遍历
for(int i=0;i<10;i++){
ch[ch.length-1] = (char)('0'+i);
print(ch);
}
for(int i=ch.length-2;i>=0;i--){
if(ch[i]!='9'){
// 进位位加1
ch[i] = (char)(ch[i]+1);
// 进位结束跳出
break;
}else{
// 进位位为9,继续进位,当前进位位变为0
ch[i] = '0';
if(i==0)
return;
}
}
}
}
// 打印函数,从第一个非零位开始打印
public static void print(char[] ch){
boolean flag = false;
for(int i=0;i<ch.length;i++){
if(flag){
System.out.print(ch[i]);
continue;
}
if(ch[i]!='0'){
flag = true;
System.out.print(ch[i]);
}
if(!flag && i==ch.length-1){
System.out.print(ch[i]);
}
}
System.out.println();
}
}
思路二:使用全排列思路,每位相当于有10种排列可能(0~9)。
借鉴全排列实现如下
public class Main4 {
public static void main(String[] args) {
char[] ch = new char[4];
for(int i=0;i<ch.length;i++){
ch[i] = '0';
}
array(ch, 0);
}
public static void array(char[] ch,int current){
if(current==ch.length-1){
for(int i=0;i<10;i++){
ch[current] = (char)(i+'0');
print(ch);
}
}else{
for(int i=0;i<10;i++){
ch[current] = (char)(i+'0');
array(ch, current+1);
}
}
}
// 打印函数
public static void print(char[] ch){
boolean flag = false;
for(int i=0;i<ch.length;i++){
if(ch[i]!='0')
flag = true;
if(flag)
System.out.print(ch[i]);
}
if(flag)
System.out.println();
}
}