0
点赞
收藏
分享

微信扫一扫

C++上机题4 整数加一

西特张 2022-03-12 阅读 35

【问题描述】

编写一个程序,读入一个以字符串表示的非负整数(串中每个字符代表一个数字),输出该正整数加一后的结果。

【输入形式】

输入一行为正整数字符串,该正整数最前不包含字符'0'(除非该正整数等于0),正整数字符串的长度小于50(即正整数的大小小于10^50)

【输出形式】

输出一行为加一后的正整数字符串

【样例输入1】

10000

【样例输出1】

10001

【样例输入2】

999999999

【样例输出2】

1000000000

————————————————————————————————————————

1.这一题乍一看感觉很离谱,为什么要自己编写一个加法呢,后来才知道,这是为了防止当数据过大超过字符限制,类似于一种加法的底层实现。

2.题目中要利用字符串来实现,也就是数组,这种属于一类问题:高精度算法中的高精度加法,而且是通常复杂类型的简化版。

3.对于高精度加法,实际上是对平时在草稿纸上写的草稿竖式加法的模拟,先从个位加,满十进一,留下余数,下一位要加上进的数。

4.有一个问题要注意,那就是想要实现高精度加法,一定要注意倒序,设出一个数组对输入的字符倒序,这样能保证在高位在数组最后,方便最高位再进位,一定要在输出时再对该数组再倒序输出。

代码如下:

#include<iostream>
#include<string>
using namespace std;
string s;
int a[55];
int main()
{
	int i;
	cin>>s;
	int len=s.length();
	for(i=0;i<len;i++)
	{
		a[i]=s[len-1-i]-'0';//a[]数组对输入的字符串s倒序
	}
	a[0]=a[0]+1;//a[0]是s的最高位,也就是一个数字最右侧,也就是个位
	for(i=0;i<len;i++)
	{
		
		a[i+1]=a[i+1]+a[i]/10;//后一位等于后一位加上前一位的进位
		a[i]=a[i]%10;//前一位等于原来的除10取余
		
	}
if(a[len]>0)//如果a的长度比原来大1,说明最高位还进了一位,那就要对表示原来长度的len加一,从而好输出
	len++;
	for(i=len-1;i>=0;i--)//倒序输出,倒到得正
		cout<<a[i];
	return 0;
}
举报

相关推荐

0 条评论