一、数组循环写法
考虑到最大的n位数字可能超过整型或longlong范围,使用长度为n的字符数组numbers[n]存储n位数字。
public static void print1toN(int n){
if(n<=0) return;
String[] baseNum={"0","1","2","3","4","5","6","7","8","9"};//对应表
int[] numbers=new int[n];//n位数字
numbers[n-1]=1;
boolean doneFlag=false;//判断输出完毕
while(!doneFlag){
String currentNumber="";
for(int i=0;i<n;i++){//根据numbers拼接得到输出字符串
if(!(numbers[i]==0&¤tNumber.equals(""))){
currentNumber=currentNumber+baseNum[numbers[i]];
}
}
if(currentNumber.equals("")){
doneFlag=true;//数字归零,输出完毕
}
else{
System.out.println(currentNumber);
}
numbersAdd(numbers,n);//字符串数字自增
}
}
以下为模拟字符串数字自增代码:
public static void numbersAdd(int[] numbers,int n){
int pointerOfNumbers=n-1;//指向数组末位
while(pointerOfNumbers>=0){
numbers[pointerOfNumbers]++;
if(numbers[pointerOfNumbers]>=10){
numbers[pointerOfNumbers]=0;
pointerOfNumbers--;//进一
}
else{
break;
}
}
}
二、递归写法
public static void printNumber1toNBit(int N){
if(N<=0) {
return;
}
else{
StringBuilder str=new StringBuilder("");
Print1toN(str,N);
}
}
public static void Print1toN(StringBuilder str,int N){
if(N==0){
if(!(str.length()==0)) System.out.println(str);
}
else{
for(int i=0;i<10;i++){
if(!(str.length()==0&&i==0)) {
str.append(i);
}
Print1toN(str,N-1);
if(!(str.length()==0)){//回溯,恢复状态,准备下一次递归
str.deleteCharAt(str.length()-1);
}
}
}
}