打印1到最大的n位数(java)
程序员文章站
2024-03-15 22:08:18
...
题目:
输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
思路:
(这个题看了半天才看懂书上的代码,/(ㄒoㄒ)/~~)
注意要考虑大数。
其中涉及到两个问题,一是大数的加1,二是大数的输出。
我用字符串来表示大数,进行处理。输出需要注意的是前边的0不能打印出来,例如09,要打印9.
大数加1,要考虑高低位进位。如果不进位的按正常的替换,>=10的时候要把低位变0,高位变1 。
代码:
import java.lang.*;
public class print {
public void printNum(int n){
if(n<=0) return;
String num = new String("0");
StringBuffer sb = new StringBuffer("");
while(n-- > 0){
sb.append("0");
}
while(!increment(sb)){
printNum(sb);
}
}
public boolean increment(StringBuffer s){
boolean isOverflow = false;
int nTakeOver = 0;
int nLength = s.length();
for(int i=nLength-1 ; i>=0 ; i--){
int nSum = s.charAt(i)-'0'+nTakeOver;
if(i==nLength-1){
nSum++;//低位加1
}
if(nSum>=10){
if(i==0){//在高位的时候nSum>=10了,说明溢出了
isOverflow = true;
}
else{//否则还没到,就进1
nSum-=10;
nTakeOver = 1;
s.setCharAt(i, (char)('0'+nSum));
}
}else{//每位不到10的时候,直接替换
s.setCharAt(i, (char)('0'+nSum));
break;
}
}
return isOverflow;
}
public void printNum(StringBuffer s){
boolean isBegin0 = true;
int nLength = s.length();
for(int i=0 ; i<nLength ; i++){
if(isBegin0&&s.charAt(i)!='0')
isBegin0 = false;
if(!isBegin0){
System.out.print(s.charAt(i));
}
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
print p =new print();
p.printNum(20);
}
}
把问题换成数字排列的解法,递归简化代码
public class print1 {
public static void Print1ToMaxOfNDigits_3(int n){
if(n < 0){
return;
}
StringBuffer s = new StringBuffer(n);
for(int i = 0; i < n; i++){
s.append('0');
}
for(int i = 0; i < 10; i++){
s.setCharAt(0, (char) (i+'0'));
Print1ToMaxOfNDigits_3_Recursely(s, n, 0);
}
}
public static void Print1ToMaxOfNDigits_3_Recursely(StringBuffer s, int n , int index){
if(index == n - 1){
PrintNumber(s);
return;
}
for(int i = 0; i < 10; i++){
s.setCharAt(index+1, (char) (i+'0'));
Print1ToMaxOfNDigits_3_Recursely(s, n, index+1);
}
}
public static void PrintNumber(StringBuffer s){
boolean isBeginning0 = true;
for(int i = 0; i < s.length(); i++){
if(isBeginning0 && s.charAt(i) != '0'){
isBeginning0 = false;
}
if(!isBeginning0){
System.out.print(s.charAt(i));
}
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
print1 p = new print1();
p.Print1ToMaxOfNDigits_3(3);
}
}