https://www.luogu.org/problemnew/show/P1601(题目传送)
显然数据范围超过了long long类型,故不能简单的用两个长整型存起来相加。这里用到大数据的高精度算法(加法)。
所谓高精度算法,就是先用字符串将输入存下,并把字符串倒序(方便之后处理)转换成数组,并依据小学竖式的算法思想,逐位处理计算结果(而这里高精度加法的核心就是进位)。
上代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[502],b[502],c[502]; 6 int main() 7 { 8 char s1[501],s2[501]; 9 cin>>s1>>s2; 10 for(int i=strlen(s1)-1;i>=0;i--) 11 a[strlen(s1)-i]=s1[i]-'0'; 12 for(int i=strlen(s2)-1;i>=0;i--) 13 b[strlen(s2)-i]=s2[i]-'0'; 14 int i=1; 15 while(i<=strlen(s1)||i<=strlen(s2)) 16 { 17 c[i]+=a[i]+b[i]; 18 if(c[i]>=10) 19 { 20 c[i+1]++; 21 c[i]%=10; 22 } 23 i++; 24 } 25 while(!c[i]&&i>1) i--; 26 for(;i>=1;i--) 27 cout<<c[i]; 28 return 0; 29 }
最后几点提醒:
1.储存结果的数组c中开头的0不输出;若c中全是零,即两数之和为0,就只保留最后一位0输出。
2.若输入的数据中有负数,就要进行特判,并视情况转化为相应的高精度减法计算。
3.输出判断时应从两个加数最高位+1开始(防止加数最高位有进位但被忽略)。