题目:输入数字n,按顺序打印出从1到最大的n位十进制,eg,输入3,输出1,2,3^999
思考:当输入的n很大的时候,求最大的n位数是不是用整型或者长整型都会溢出?即我们需要考虑大数问题
方法一:在字符串上模拟数字加法,首先把字符串中的每一个数字都初始化为'0',然后每一次为字符串表示的数加1,再打印出来
方法二:全排列思想,如果在数字前面补0,会发现n位所有十进制数其实就是n个从0到9的全排列,我们把数字的每一位从0到9排列一遍,就得到了所有的十进制数,只是在打印的时候,数字排在前面的0不打印出来。用递归,数字的每一位可能是0到9中的一个数,然后设置下一位,递归结束的条件是我们已经设置了数字的最后一位
import java.util.Arrays;
public class wr12OneToN {
public static void printToMax(int n){
if(n<=0){
return ;
}
// 将字符串中的每个数字初始化为'0'
char []number=new char[n];
for(int i=0;i<n;i++){
number[i]='0';
}
// 为字符串所表示的数字加1
while(!Increment(number)){
printNumber(number);
}
return ;
}
// 若加1时第一个字符产生了进位,则已经是最大的n了,该函数返回true,while循环终止
public static boolean Increment(char[] num){
boolean isOverflow=false;
int size=num.length;
int carry=0;
for(int i=size-1;i>=0;i--){
int temp=num[i]-'0'+carry;
if(i==size-1){
temp++;
}
if(temp>=10){
if(i==0){
isOverflow=true;
}
else{
temp=temp-10;
carry=1;
num[i]=(char)('0'+temp);
}
}else{
num[i]=(char)('0'+temp);
break;
}
}
return isOverflow;
}
// 只有在碰到第一个非0的字符后才开始打印,直到字符串的结尾
public static void printNumber(char[] num){
int size=num.length;
int i=0;
while(i<size && num[i]=='0'){
i++;
}
if(i==size){
return ;
}
for(;i<size;i++){
System.out.print(num[i]);
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// printToMax(2);
printToMaxN(2);
}
// 全排列思想
public static void printToMaxN(int n){
if(n<=0){
return ;
}
char [] num=new char[n];
Arrays.fill(num, '0');
printOrder(num,n,0);
}
public static void printOrder(char[] num,int length,int index){
if(index==length){
return ;
}
for(int i=0;i<10;i++){
num[index]=(char)(i+'0');
if(index==length-1){
printNumber(num);
}
printOrder(num,length,index+1);
}
}
}