要求:打印从1到最大的n位数。如打印9,0=>1=>2=>3=>4=>5=>6=>7=>8=>9。
思路:由于当输入n很大时,使用int或long都会溢出。
比如,int和long的最大位数分别为、
需要考虑大数问题可以借用字符串或数组表示大数。首先把字符串中的每一个数字初始化为'0',然后每一次为字符串表示的数加1,再打印出来。
因此,我们只需要做两件事:
- 一是在字符串表示的数字上模拟加法:
我们首先设置是否溢出标识,是否进位标识,以及取得字符数组长度,遍历这个字符数组,在末尾进行+1操作,如果末尾字符在+1后变为不小于10的数字,我们将末尾减去10加上‘0’字符赋值为末位,进位标识设置为1,在循环次位时+1,然后再判断是否为不小于10,是的话重复上面的步骤。直到判断高位是不是不小于10,是的话字符数组溢出;如果末尾字符在+1后是小于10的数字,直接加上‘0’赋值给末尾,跳出当前循环,返回没有溢出。
- 二是把字符串表示的数字打印出来。注意在打印时,数字排在前面的0不打印。
public class L17_Print1ToMaxOfNumber {
public static void Print1ToMaxOfNumber(int n){
if(n <= 0){
System.out.println("输入的n没有意义");
return;
}
// 先创建一个字符数组,长度为n, 并赋值0
char number[] = new char[n];
for (int i = 0; i < number.length; i++) {
number[i]='0';
}
while(!incrementNumber(number)){ //如果大数自加,直到自溢退出
printNumber(number); //打印大数
}
}
/**
* 在字符串表示的数字上模拟加法
* @param number
* @return
*/
// 我们首先设置是否溢出标识,是否进位标识,以及取得字符数组长度,遍历这个字符数组,在末尾进行+1操作,
// 如果末尾字符在+1后变为不小于10的数字,我们将末尾减去10加上‘0’字符赋值为末位,进位标识设置为1,在循环次位时+1,
// 然后再判断是否为不小于10,是的话重复上面的步骤。直到判断高位是不是不小于10,是的话字符数组溢出;
// 如果末尾字符在+1后是小于10的数字,直接加上‘0’赋值给末尾,跳出当前循环,返回没有溢出。
private static boolean incrementNumber(char[] number) {
boolean isOverFlow = false; // 判断是否溢出
int nTakeOver = 0; // 判断是否进位
int nLength = number.length; // 几位
for(int i=nLength-1;i>=0;i--){ // 从右往左,个位开始
int sum = number[i]-'0'+nTakeOver; // 将字符转换为对应的数字,并加上进位
if(i==nLength-1){ // 如果是末尾个位开始,加一
sum++;
}
if(sum>=10){ // 此时大于等于10
if(i==0){ // 若成立,表示溢出
isOverFlow = true;
}else{
sum -=10; // 归零
nTakeOver = 1; // 进一位
number[i] = (char)('0'+sum);
}
}else{
number[i] = (char)('0'+sum); // 数字转换为字符串
break;
}
}
return isOverFlow;
}
/**
* 在打印时,数字排在前面的0不打印。
* @param number
*/
private static void printNumber(char[] number) {
boolean isBeginning0 = true;
for(int i=0; i<number.length;i++){ // 从头到尾进行判断该位值是否为'0'
if(isBeginning0 && number[i] != '0'){
isBeginning0 = false;
}
if(!isBeginning0){
System.out.print(number[i]);
}
}
System.out.println();
}
public static void main(String[] args) {
char[] a = {'1','0'};
String b = "dsfasdf";
int num = a[0]-'0'; // 将字符转换为数字
System.out.println(num);
System.out.println(b.charAt(b.length()-1));
System.out.println("******");
Print1ToMaxOfNumber(2);
}
}
网友评论