这是该题的链接http://acm.hdu.edu.cn/showproblem.php?pid=1002
具体的题的内容就不过多描述了,想必你已经知道了,当我看完这道题后就知道咋写了,可是这道题从开始写到最后accept却花了我好长时间。
先描述一下我的思路,当我看到第二个测试数据后就知道用可以表示范围最大的unsigned long long int 也是无法表示的,之前刷蓝桥杯里面的题,遇到过这种题
因为我对java熟悉一下,所以可以使用BigDecimal解决,或者用数组.所以我果断采用了数组,就是先把输入的数(字符串)存入两个数组里面,每个元素代表一位
,然后反转,这样可以先个位数相加,最后再把结果反转过来即可,由于写算法从java转c++不就,所以c++很多函数还不熟,还有这道题的一些细节等因素耽误了我一些时间。
不过最终成功accept;
下面是具体的代码。
#include<bits/stdc++.h>
using namespace std;
char arr2[1005]={‘0‘};//保存输入的第一个字符串
char arr3[1005]={‘0‘};//保存输入的第二个字符串
//声明的数组能放在main()之外就尽量放在main()之外,可以减少一些不常见的错误
int main()
{
int a ;
cin >>a;
int k=1;//输出时用来标记次序
int s1=a;//保存a值
string a1,a2;
string arr1[a];//最终的和,
while(a--){
arr2[1000]={0};
arr3[1000]={0};
cin >> a1 >> a2;
reverse(a1.begin(),a1.end());//加数反转方便先从个位相加
reverse(a2.begin(),a2.end());
strcpy(arr2,a1.c_str());
strcpy(arr3,a2.c_str());//字符串变字符数组方便保存
int ml=max(a1.length(),a2.length());//长度较大的加数
int mll=min(a1.length(),a2.length());//长度较小的加数
int arr4[ml+1]={0};
int flag=0;
for(int i=0;i<ml;i++){
if(i<mll || a1.length()==a2.length()){
arr4[i]=(((int)arr2[i]-48)+((int)arr3[i]-48)+flag)%10;//对应位相加
flag=(((int)arr2[i]-48)+((int)arr3[i]-48)+flag)/10;//是否进位保存在flag里面
}
if(i>=mll && a1.length()>a2.length()){
arr4[i]=(((int)arr2[i]-48)+flag)%10;//48是保证char到int相互转变代表的数字不变
flag=(((int)arr2[i]-48)+flag)/10;
}
if(i>=mll && a2.length()>a1.length()){
arr4[i]=(((int)arr3[i]-48)+flag)%10;
flag=(((int)arr3[i]-48)+flag)/10;
}
if(i==ml-1 && flag==1){//确定最高位是否为进位得到的1
arr4[i+1]=1;
}
}
if(arr4[ml]==0){//最高位为0则不输出最高位,
reverse(arr4,arr4+(ml+1));
for(int i=1;i<ml+1;i++){
arr1[a]+=((char)(arr4[i]+48));
}
}
else{
reverse(arr4,arr4+(ml+1));
for(int i=0;i<ml+1;i++){
arr1[a]+=((char)(arr4[i]+48));
}
}
reverse(a1.begin(),a1.end());
reverse(a2.begin(),a2.end());//再此反转得到最终结果
cout <<"Case " <<k++<<":" << endl;
cout <<a1 <<" + " <<a2<<" = " << arr1[a] << endl;
if(a!=0){
cout << endl;
}
}
return 0;
}
结论:由于自己的c++水平一般,所以代码并不是很规范,请原谅。
原文:https://www.cnblogs.com/henuliulei/p/9743592.html