剑指Offer 面试题17:打印从1到最大的n位数 Java代码实现

题目:输入数字n,按顺序打印从1到最大的n位的十进制数。比如,输入3,则打印出1、2、3一直到999。


这个题目好像很简单,求出最大的n位数,然后for循环打印就好了。但是Java中int类型的范围是-2147483648~2147483647,也就是输入的n如果是10,那么int的范围就不够了。我们事先不知道这个数的范围,这一类关于大数的问题,经常使用字符串或者说是字符数组来解决。这里,我们用一个容量为n的字符数组来表示n位数字,在字符数组上模拟数字加法,每次加一,然后打印数组里面的有效数字。


主方法的Java代码如下:

public static void print1ToMaxOfDigits1(int n){
		if(n<=0)
			return;
		//长度为n的char数组表示n位的整数,初始值都为字符'0'
		char[] number=new char[n];
		for(int i=0;i

increment()方实现数字自增,并且判断是否自增成功,也即有没有到最大的n位数;printNumber()方法实现以我们习惯的数字表示形式打印数组中的字符。

private static boolean increment(char[] number) {
		boolean isOverflow=false;
		//carry记录是否有进位
		int carry=0;
		int len=number.length;
		
		for(int i=len-1;i>=0;i--){
			//两个字符相见,就是对应的ASCII码相减
			//得到的nSum是int类型
			int nSum=number[i]-'0'+carry;
			//i==len-1 就是数字的个位,每次个位加1
			if(i==len-1)
				nSum++;
			//处理进位
			if(nSum>=10){
				if(i==0)
					//i=0是数字最高位,nSum>=10就溢出了
					isOverflow=true;
				else{
					//值减10,进位改为1
					nSum-=10;
					carry=1;
					number[i]=(char) ('0'+nSum);
				}
			}else{
				//不需要进位时,转为数字对应的字符表达存进数组
				number[i]=(char) ('0'+nSum);
				break;
			}
		}
		return isOverflow;
	}

这个函数里面需要注意的是数组中字符型的'0'-'9'与数字0-9转化。printNumber很简单,代码如下:

private static void printNumber(char[] number) {
		boolean isBeginning=false;
		
		for(int i=0;i

测试输出太多,不放了。递归的解法还没搞清楚,弄清楚了再贴上来!



你可能感兴趣的:(剑指offer_Java实现)