剑指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<number.length;i++){
			number[i]='0';
		}
		while(!increment(number)){
			printNumber(number);
		}
	}

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<number.length;i++){
			if(number[i]!='0')
				isBeginning=true;
			
			if(isBeginning)
				System.out.print(number[i]);
		}
		System.out.println();
		
	}

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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值