题目:输入数字n,按顺序打印出从1到最大的n为十进制数。比如输入3,则打印1、2、3一直到最大的3位数999。
分析:如果n不为正数的情况。以及最重要的是n较大时,n位十进制数可能超出了int甚至long型的范围。因此考虑用字符串或者数组来表示这样的大数。一个一个加1的方式
import java.util.Scanner;
public class Solution
{
public void print1ToMaxOfNDigital(int n)
{
if (n <= 0)
return;
int[] number = new int[n]; // 自动初始化为0
while (!increment(number))
printNumber(number);
}
public boolean increment(int[] number)
{
boolean isOverFlow = false; // 用于确认是否达到最大数值
int nTakeOver = 0; // 用于进位
int nLength = number.length;
for (int i = nLength - 1; i >= 0; i--)
{
int sum = number[i] + nTakeOver;
if (i == (nLength - 1))
sum++;
if (sum >= 10) // 即将进位
{
if (i == 0)
isOverFlow = true;
else
{
sum -= 10;
nTakeOver = 1;
number[i] = sum;
}
}
else
{
number[i] = sum;
break;
}
}
return isOverFlow;
}
public void printNumber(int[] number)
{
boolean is0 = true;
for (int i = 0; i < number.length; i++)
{
if (is0 && (number[i] != 0))
is0 = false;
if (is0 == false)
System.out.print(number[i]);
}
System.out.print('\t');
}
// 测试函数
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int n = input.nextInt();
Solution temp = new Solution();
temp.print1ToMaxOfNDigital(n);
}
}
分析2:如果在数字前面补0,发现n位十进制数实际上是n个从0到9的全排列。全排列用递归比较方便
import java.util.Scanner;
public class Solution
{
public void print1ToMaxOfNDigital(int n)
{
if (n <= 0)
return;
int[] number = new int[n]; // 自动初始化为0
for (int i = 0; i < 10; i++)
{
number[0] = i;
printToMaxOfNDigitalsRecursively(number, n, 0);
}
}
public void printToMaxOfNDigitalsRecursively(int[] number, int length, int index)
{
if (index == (length - 1))
{
printNumber(number);
return;
}
for (int i = 0; i < 10; i++)
{
number[index + 1] = i;
printToMaxOfNDigitalsRecursively(number, length, index + 1);
}
}
public void printNumber(int[] number)
{
boolean is0 = true;
for (int i = 0; i < number.length; i++)
{
if (is0 && (number[i] != 0))
is0 = false;
if (is0 == false)
System.out.print(number[i]);
}
System.out.print('\t');
}
// 测试函数
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int n = input.nextInt();
Solution temp = new Solution();
temp.print1ToMaxOfNDigital(n);
}
}