打印1到最大的n位数

    科技2026-01-12  16

    1. 字符串模拟数字加法

    第一步:字符串表达的数字上模拟加法 第二步:字符串表达的数字打印出来

    public static void printToMaxOfDigits(int n) { if (n <= 0) return; char number[] = new char[n]; //使用数组来存储大数 for (int i = 0; i < number.length; i++) { number[i] = 0; } while (!incrementNumber(number)) { //字符串表达的数字上模拟加法 printNumber(number); //字符串表达的数字打印出来 } } //实现了用O(1)时间判断是不是已经到最大的n位数 private static boolean incrementNumber(char[] num) { boolean isOverflow = false; // 判断是否溢出 int nTakeOver = 0; //判断是否进位 int nLength = num.length; for (int i = nLength - 1; i >= 0; i--) { int nSum = num[i] - '0' + nTakeOver;//取到第i位的字符转换为数字 + 进位符 if (i == nLength - 1) ++nSum; //末尾加1 if (nSum == 10) { if (i == 0) { isOverflow = true; } else { nSum -= 10; nTakeOver = 1; num[i] = (char) ('0' + nSum); } } else { num[i] = (char) (nSum + '0'); break; } } return isOverflow; } //在数字的前面补0打印的时候这些补位的0不应该打印出来 private static void printNumber(char[] number) { boolean isBeginning0 = true; int nLength = number.length; for (int i = 0; i < nLength; i++) { if (isBeginning0 && number[i] != '0') { isBeginning0 = false; } if (!isBeginning0) { System.out.print(number[i]); } } System.out.println(); }

    2. 数字排列解法

    全排列用递归实现,数字的每一位都可能是0~9中的一个数,然后设置下一位。

    static void printToMaxOfNDigits(int n) { if (n <= 0) return; char[] number = new char[n]; for (int i = 0; i < 10; i++) { number[0] = (char) (i + '0'); printToMaxOfNDigitsRecursively(number,n,0); } } static void printToMaxOfNDigitsRecursively(char[] number, int length, int index) { if (index == length - 1) { printNumber(number); return; } for (int i = 0; i < 10; i++) { number[index + 1] = (char) (i + '0'); printToMaxOfNDigitsRecursively(number, length,index + 1); } }
    Processed: 0.018, SQL: 9