package java_jianzhioffer_algorithm;
import java.util.Scanner;
/**
* 题目:打印1到最大的N位数
* @author hexiaoli
* 思考:
* 1)字符串模拟数字加法。(用字符串或者数组表示大数)
* 2)转化为数字排列问题
*/
public class PrintToMaxOfDigits {
public void printToMaxOfDigits1(int n){
if(n <= 0) {
System.out.println("输入不合法,n至少应该大于0");
return ;
}
//声明一个字符串数组,用来存放一个大数,并初始化为0
char[] number = new char[n];
for (int i = 0; i < number.length; i++) {
number[i] = '0';
}
while(!increment(number)) {//自加不溢出的话,会一直执行
printNumber(number);//打印大数
}
}
public boolean increment(char[] number) {
boolean isOverFlow = false;//判断是否溢出
int length = number.length;//字符串长度
int nTakeOver = 0;//判断是否需要进位
for(int i = length -1;i>=0;i--) {
int nSum = number[i]-'0'+nTakeOver;//第i位的字符转化为数字+进位符
if(i == length -1) nSum++;//末尾自加1
if(nSum >= 10) {
if(i == 0) {//最高位溢出
isOverFlow =true;
}else {//需要进位
nSum -=10;//末尾清零
nTakeOver = 1;//需要进位
number[i] = (char)('0'+nSum);
}
}else {//nSum<10
number[i] = (char)('0'+nSum);
break;
}
}
return isOverFlow;
}
public void printToMaxOfDigits2(int n){
if(n <= 0) {
System.out.println("输入不合法,n至少应该大于0");
return ;
}
//声明一个字符串数组,用来存放一个大数,并初始化为0
char[] number = new char[n];
for (int i = 0; i < number.length; i++) {
number[i] = '0';
}
for (int i = 0; i < 10; ++i) {
number[0] = (char) (i + '0');//首位历经1-9
printToMaxOfNDigitsRecursively(number, n, 0);
}
}
//利用递归实现1到最大的n位数的全排列
public void printToMaxOfNDigitsRecursively(char[] number, int n, int index) {
if(index == n - 1){//如果到最后一位则打印这个数
printNumber(number);
return;
}
for (int i = 0; i < 10; ++i) {
number[index + 1] = (char) (i + '0');
printToMaxOfNDigitsRecursively(number, n, index + 1);
}
}
//避免出现 0000这种情况
public void printNumber(char[] number) {
boolean isBeginning0 = true;
int length = number.length;
for (int i = 0; i < number.length; i++) {
if (isBeginning0 && number[i] != '0' ) {
isBeginning0 = false;
}
if (!isBeginning0) {
System.out.print(number[i]);
}
}
System.out.println();
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
PrintToMaxOfDigits ptmd = new PrintToMaxOfDigits();
// ptmd.printToMaxOfDigits1(n);
ptmd.printToMaxOfDigits2(n);
}
}
剑指offer书(17)打印1到最大的N位数
猜你喜欢
转载自blog.csdn.net/hxl0925/article/details/89430337
今日推荐
周排行