1、问题描述
输入n,打印从1到最大的n位十进制数。比如输入的是3,那么依次打印1,2,…,999。
2、解题思路
- 分析:
- (1)这里并没有对n的范围具体说明,如果n是一个比较大的数,使用整型int,或者长整型long等数据类型都可能会溢出。也就是说我们得考虑大数问题。
- (2)表达一个大数最常用的方法是是用字符串或者数组表达大数。所以这道题有两种解法,第一种是使用字符串模拟加法;第二种是采用数组表示,即将该问题转换成数字的排列。
- 思路1:如果采用转换成数字排列的思路,使用一个长度为n的字符数组,数组中的每一个元素都初始化为’0’。那么接下来我们只需要做两件事:第一是对n位,每位取值范围[0,9]的字符数组做全排列,每一个排列对应一个数字;第二是把数组表达的数字打印出来。全排列具体实现实现可以采用循环加递归(Permutation(char [] array , int length,int currentdepth)
- 思路2:第二种方法是采用字符串模拟数字加法。这种方法每次在字符数组上加1,然后把它打印出来,直到到最大的n位数停止。所以关键操作是模拟加1,和判断是否到达最大的n位数。判断是否到达最大的n位数可以根据最高位是否产生进位得到,而加1时需要注意,如果遇到999,…,99的情况,即某位加1大于等于10后,就可能会产生连续进位的,需要循环,如果没有产生进位,则循环停止。
3、代码实现
public class Problem_12 {
char [] number ;
Problem_12(int length){
number = new char[length];
for(int i= 0;i<length;i++){
number[i] = '0';
}
}
public boolean increment(){
boolean isoverflow = false;
int takeover = 0;
for (int j=number.length - 1; j >=0; j--){
int bitsum = number[j] - '0' + takeover;
if(j == number.length - 1){
bitsum += 1;
}
if(bitsum >= 10){
if(j == 0){
isoverflow = true;
}
else {
bitsum -= 10;
takeover = 1;
number[j] = String.valueOf(bitsum).toCharArray()[0];
}
}
else {
number[j] = String.valueOf(bitsum).toCharArray()[0];
break;
}
}
return isoverflow;
}
public void printnumber(){
System.out.println(String.valueOf(number));
}
}
4、相关题目
(1)实现任意两个整数数的加法。由于没有限定输入两个数的大小范围,所以应该把它当作大数问题来处理。