一、题目
输入数字n,按顺序打印出从1到n位最大十进数的数值。比如输入3,则打印出1、2、3一直到最大三位数即999。
二、解题思路
①使用一个n位的数组来存储每一位的元素。例如n位3,则000表示为[0,0,0]。
使用递归的方式,存放每一位元素值。
②同上,使用一个n位的数组来存储每一位的元素。然后循环执行加1运算,并在数组中进行模拟进位,直到最高位需要进位,则表示循环结束
方法一
public void print1ToMaxOfNDights1s(int n) {
if (n < 0) {
return;
}
char[] digits = new char[n];
for (int i = 0; i < n; i++) {
digits[i] = '0';//初始化
}
for (int i = n - 1; i >= 0; i--) {
System.out.println("我是for循环");
while (digits[i] != '9') {//n=1,0;
System.out.println("我是第二层的while循环");
int m = 0;// digit[0]为计算位,累加
digits[m]++;//digins[0]++ 只能加到9 ,char中10代表换行键
while (m < n - 1 && digits[m] > '9') {
digits[m] = '0';
digits[m + 1]++;
m++;
}
printdigits(digits);
}
}
}
//打印
private void printdigits(char[] digits) {
int m = digits.length - 1;
while (digits[m] == '0') {
m--;
}
for (int i = m; i >= 0; i--) {
System.out.print(digits[i]);
}
System.out.println();
}
方法二
public void printOneToNthDigits(int n,char[] char){
if(n>=char.length){
printArr(char);
}else{
for(int i=0;i<=9;i++){
arr[n]=i;
printOneToNthDigits(n+1,char);
}
}
}
/* 分析递归 的每一层
for(int i=0;i<=9;i++){
arr[0]==0; //sys arr[0=0; n== arr[0]=1:0,1,2,3,4,5,6,7,8,9,
printdigit(1,arr) 1<2; //end2
for(int i=0; i<=9;i++){
arr[1]=0; 1,2,,3,4,5,6,7,8,9 [][9]
printdigits(2,arr)//end1
printarr();//end1
}
}
*/
方法三
/**
* 输入数字n,按顺序打印出从1最大的n位十进制数。
*
* @param n 当前处理的是第个元素,从0开始计数
* @param arr 存放结果的数组
*/
/**
* 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3 一直到最大的3位数即999。
* 【第二种方法,比第一种少用内存空间】
*
* @param n 数字的最大位数
*/
public static void printOneToNthDigits2(int n) {
// 输入值必须大于0
if (n < 1) {
throw new RuntimeException("The input number must larger than 0");
}
// 创建一个长度为n的数组
int[] arr = new int[n];
// 为数组元素赋初始值
for (int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
// 求结果,如果最高位没有进位就一直进行处理
while (addOne(arr) == 0) {
printArray(arr);
}
}
/**
* 对arr表示的数组的最低位加1 arr中的每个数都不能超过9不能小于0,每个位置模拟一个数位
*
* @param arr 待加数组
* @return 判断最高位是否有进位,如果有进位就返回1,否则返回0
*/
public static int addOne(int[] arr) {
// 保存进位值,因为每次最低位加1
int carry = 1;
// 最低位的位置的后一位
int index = arr.length;
do {
// 指向上一个处理位置
index--;
// 处理位置的值加上进位的值
arr[index] += carry;
// 求处理位置的进位
carry = arr[index] / 10;
// 求处理位置的值
arr[index] %= 10;
} while (carry != 0 && index > 0);
// 如果index=0说明已经处理了最高位,carry>0说明最高位有进位,返回1
if (carry > 0 && index == 0) {
return 1;
}
// 无进位返回0
return 0;
}
/**
* 输入数组的元素,从左到右,。从第一个非0值到开始输出到最后的元素
*
* @param arr 要输出的数组
*/
public static void printArray(int[] arr) {
// 找第一个非0的元素
int index = 0;
while (index < arr.length && arr[index] == 0) {
index++;
}
// 从第一个非0值到开始输出到最后的元素。
for (int i = index; i < arr.length; i++) {
System.out.print(arr[i]);
}
// 条件成立说明数组中有非零元素,所以需要换行
if (index < arr.length) {
System.out.println();
}
}