【问题描述】
编写一个程序,读入一个以字符串表示的非负整数(串中每个字符代表一个数字),输出该正整数加一后的结果。
【输入形式】
输入一行为正整数字符串,该正整数最前不包含字符'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;
}