打印1到最大的n位数(java)
2017-05-12 13:10
295 查看
题目:
输入数字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); } }
相关文章推荐
- 剑指Offer面试题12(Java版):打印1到最大的n位数
- 剑指Offer(Java版):打印1到最大的n位数
- 打印1到最大的n位数 Java
- java打印从1到最大的n位数
- 剑指offer-chapter3-面试题12-打印1到最大的n位数(java)
- 【剑指offer-Java版】12打印1到最大的n位数
- 剑指Offer——打印1到最大的n位数(好题)(java实现)
- 剑指Offer面试题12:打印1到最大的n位数 Java实现
- Java之BigInteger(面试题12:打印1到最大的n位数)
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
- 打印1到最大的n位数(Java实现)
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
- 剑指Offer 面试题17:打印从1到最大的n位数 Java代码实现
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
- [剑指offer] 打印1到最大的n位数(JAVA实现)
- 二进制中1的个数 & 打印1到最大的n位数 Java实现
- 剑指offer--面试题12:打印1到最大的n位数--Java实现
- 从1打印到N位数最大数 的全排列方法。Java
- 打印1到最大的n位数----java实现
- 打印1到最大的n位数-Java