题目:打印1到最大的n位数
输入数字n,按顺序打印出从1到最大n位十进制数。比如输入n = 3,则打印出1,2,3……999.
算法分析:
如果我们在数字前面补0的话,就会发现n位所有十进制数其实就是n个从0到9的全排列。也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。只是打印的时候,数字排在前面的0我们不打印出来罢了。
算法源程序:
/**************************************************************
* Copyright (c) 2016, 北京邮电大学
* All rights reserved.
* 版 本 号:v1.0
* 题目描述:打印1到最大的n位数
* 输入数字n,按顺序打印出从1到最大n位十进制数。比如输入n = 3,则打印出1,2,3……999.
* 输入描述:3
* 程序输出: 1,2,3……999
* 问题分析:无
* 算法描述:如果我们在数字前面补0的话,就会发现n位所有十进制数其实就是n个从0到9的全排列。也就是说,
* 我们把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。只是打印的时候,数字排在前面的0我们不打印出来罢了。
*
* 完成时间:2016-10-30
***************************************************************/
package org.marsguo.offerproject12;
import java.util.Scanner;
class SolutionMethod1{
public void printOneToNthDigits(int n){
if(n < 1){
throw new RuntimeException("The input must larger than 0");
}
int[] arr = new int[n];
printOneToNthDigits(0,arr);
}
public void printOneToNthDigits(int n,int[] arr){
if(n >= arr.length){
printArray(arr);
}else{
for(int i = 0; i <= 9; i++){
arr[n] = i;
printOneToNthDigits(n + 1,arr);
}
}
}
public void printArray(int[] arr){
int index = 0;
while(index < arr.length && arr[index] == 0){
index++;
}
for(int i = index; i < arr.length; i++){
System.out.print(arr[i]);
}
if(index < arr.length){
System.out.println();
}
}
public void printOneToNthDigits2(int n){
if(n < 1){
throw new RuntimeException("The input number must larger than 0");
}
int[] arr = new int[n];
for(int i = 0; i < arr.length; i++){
arr[i] = 0;
}
while(addOne(arr) == 0){
printArray(arr);
}
}
public int addOne(int[] arr){
int carry = 1;
int index = arr.length;
do{
index--;
arr[index]+=carry;
carry = arr[index]/10;
arr[index]%= 10;
}while(carry != 0 && index > 0);
if(carry > 0 && index == 0){
return 1;
}
return 0;
}
}
public class PrintOneToMaxDigits {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入位数n:");
int n = scanner.nextInt();
scanner.close();
SolutionMethod1 solution1 = new SolutionMethod1();
System.out.println("输出数字为:");
solution1.printOneToNthDigits(n);
solution1.printOneToNthDigits2(n);
}
}
程序运行结果: