在字符串上模拟数字加法/打印从1到最大的n位数

用字符串模拟数字加法的理由

当数字n很大时,用整型(int)甚至长整型(long)都有可能溢出,这就是我们通常要考虑的大数问题。
那我们用什么表示一个大数呢?通常用的是字符串或数组

用字符串模拟数字加法的分析

当用字符串模拟数字加法时,就是要将字符串的每一位表示成’0’~‘9’之间的某一个字符。而数字加法,无非就是在字符串的最后一位不断加1,当最后一位为10时,进位。所以用字符串模拟数字加法就是不断加1和进位的过程。
所以在程序实现的时候,需要一个进位标志nTakeOver,取值为0或1。设想一下当前数字为199,加1之后,数字变成200,这是两次进位过程,操作了三位数字。也就是说,字符串模拟数字加法时,如果遇到进位情况,应该在循环里面实现。
**那么如何实现数字末位加1呢?**首先要获取当前字符串中的末位值,这里要注意字符与数字的不同。比如说要获取字符串number中第i位的数字,那么语句应该写为:number[i]-‘0’。
现在将加1与进位结合起来。用nSum获取第i位字符所表示的数字并加上进位符。如果当前正在对末位进行加1操作,那么末位的值应该是nSum+1;如果加1后末位变成了’10’,进位符nTakeOver应设置为1,然后对末位的前一位进行操作,其值就应该为nSum。如果当前并非对末位操作,而是对第i位操作,那么第i位的值应该等于nSum,并判断nSum是否为’10’,如果是,再进行进位操作。

程序实现

public boolean increaseNum(char[] number) {
	boolean isOverFlow = false;//结束标志
	int nTakeOver = 0;//进位标志
	for (int i = number.length-1, i >=0, i--) {
		int nSum = number[i] - '0' + nTakeOver;
		if (i == number.length - 1) {
			nSum++;//末位加1操作
		}

		if (nSum >= 10{
			if (i == 0) {
				isOverFlow = true;//结束
			}
			else {
				nTakeOver = 1;
				nSum -= 10;
				number[i] =char)(nSum + '0');
			}
		}
		else {
			number[i] = (char)('0' + nSum);
			break;//加1完成,退出当前循环
		}
	}
	return isOverflow;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值