n位最大十进制数问题
题目描述
键盘输入一个整数n,要求编写函数实现按顺序打印出从1开始到最大的n位十进制数。例如输入3,则打印输出1、2、3…999;最大的3位数是999.
注意
由于没有指定n的范围因此n有可能会很大,例如50,100等,此时最大的n位十进制数将超出int和long的范围,因此不宜使用int和long来定义临时变量。
public class Code012 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
// printNums(n);
// printNums01(n);
// printNums02(n);
printNums03(n);
}
//当n较小时,直接用整数递增遍历打印
private static void printNums01(int n){
int number =1;
int i=0;
while (i++<n){
number*=10;
}
//number-1是最大的n位数
for(int j=1;j<number;j++){
System.out.print(j+" ");
}
}
//当n较大时,n位10进制将超出long的范围,因此采用string来存储数字
private static void printNums02(int n){
if(n<=0){
return;
}
StringBuffer numbers=new StringBuffer();
for(int i=0;i<n;i++){
numbers.append('0');
}
while (!Increment(numbers)){
PrintNumber(numbers);
}
}
private static void PrintNumber(StringBuffer numbers) {
boolean isBeginning0=true;
for(int i=0;i<numbers.length();i++){
if(isBeginning0 && numbers.charAt(i)!='0'){
isBeginning0=false;
}
if(!isBeginning0){
System.out.print(numbers.charAt(i));
}
}
System.out.print(" ");
}
private static boolean Increment(StringBuffer numbers) {
boolean isOverflow=false;
int nTakeOver=0;
int nLength=numbers.length();
for(int i=nLength-1;i>=0;i--){
int nSum=numbers.charAt(i)-'0'+nTakeOver;
if(i==nLength){
nSum++;
}
if(nSum>=10){
if(i==0){
isOverflow=true;
}else {
nSum-=10;
nTakeOver=1;
numbers.setCharAt(i,(char)('0'+nSum));
}
}else {
numbers.setCharAt(i, (char) ('0'+nSum));
break;
}
}
return isOverflow;
}
//思路3:用数字排列的方法表示:如果我们在数字前面补0的话,就会发现n位所有十进制数其实就是n个从0到9的全排列。也就是说,我们把数字的
//每一位都从0到9排列一遍,就得到了所有的十进制数。当然打印的时候,我们应该将前面的0补位去掉。
public static void printNums03(int n){
if(n < 0){
return;
}
StringBuffer s = new StringBuffer(n);
for(int i = 0; i < n; i++){
s.append('0');
}
for(int i = 0; i < 10; i++){
s.setCharAt(0, (char) (i+'0'));
Print1ToMaxOfNDigits_3_Recursely(s, n, 0);
}
}
public static void Print1ToMaxOfNDigits_3_Recursely(StringBuffer s, int n , int index){
if(index == n - 1){
PrintNumber(s);
return;
}
for(int i = 0; i < 10; i++){
s.setCharAt(index+1, (char) (i+'0'));
Print1ToMaxOfNDigits_3_Recursely(s, n, index+1);
}
}
}