小渣渣的算法学习笔记:2018秋招备战
数据结构类算法总结:大数相加
数据结构类算法总结:大数相加
1.题目描述:
输入数字n,按顺序打印出从1到最大的n位十进制数。 比如,输入3,则打印出1,2,3,.....,一直到最大的3位数即999。
2.题目分析
1、这是一个典型的大数加法问题,无论是int还是long long类型多无法表示。所以在解决大数问题时, 通常是使用字符串或者数组实现其功能(由于个人比较钟爱数组,所以下面代码是使用数组实现的)。 2、在大数的加法中,我们需要注意的问题是进位问题。 3、在该题中还需要判断是否为最大的n位整数。这里需要一个小技巧, 我们只需判断最高位(第n位)是否要进位,如果需进位,则已经为最大数。
3.代码实现:
public class Solution68_17 { public static void main(String[] args) { Print1ToMaxOfNDigits(1); } public static void Print1ToMaxOfNDigits(int n){ if(n <= 0){ return; } StringBuffer number = new StringBuffer(); for(int i = 0; i < n; i++){ number.append('0'); } while(!Increment(number)){ PrintNumber(number); } } public static boolean Increment(StringBuffer s){//判断是否达到n位数边界 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++; } if(nSum >= 10){ if(i == 0){ isOverflow = true; }else{ nSum -= 10; nTakeOver = 1; s.setCharAt(i, (char) ('0' + nSum)); } }else{ s.setCharAt(i, (char) ('0' + nSum)); break; } } return isOverflow; } public static void PrintNumber(StringBuffer s){ boolean isBeginning0 = true; for(int i = 0; i < s.length(); i++){ if(isBeginning0 && s.charAt(i) != '0'){//当前位置元素不为0则打印当前元素 isBeginning0 = false; } if(!isBeginning0){ System.out.print(s.charAt(i)); } } System.out.println(); } }