您的位置:首页 > 其它

杭电ACM—HDU1002 A + B Problem II

2016-08-03 18:30 211 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002

题目大意:有a,b两个数求其和,注意到整数是非常大的,这意味着你不应该处理它们使用32位整数。

这个题目应该把两个整数a,b改用字符串输入(因为数据非常大),可利用vector容器来保存其中字符,先用reverse函数对字符串进

行反排序,然后比较字符串长度(把相加后的值赋给长字符串),把字符转为数字再相加,如果相加后的数大于9,则需进1,最后

把字符一个个放到容器内。要分a,b长度是否相同两种的情况。详情看代码及代码后面的注释。

代码如下:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n,i,m,k=1,j;
vector<char> vec;
char t,x;
string str,str1,str2,str3,str4;
while(cin>>n)
{
while(n--)
{
t=x='0';
vec.clear();
cin>>str>>str1;
str2=str;str3=str1;
reverse(str.begin(),str.end());
reverse(str1.begin(),str1.end());
if(str.size()<str1.size())
{
swap(str,str1);//str,str1交换位置
}
for(i=0;i<str1.length();i++)//i要小于字符串长度小的字符串
{
m=(str[i]-'0')+(str1[i]-'0');
if(m>9)
{
str[i]=m%10+'0';
str[i+1]+=1;//进1位加1
if(i==str1.length()-1) {t='1';}
}
else {str[i]=m+'0';}
vec.push_back(str[i]);
}
if(i<str.length())//i小于长字符串str
{
for(j=i;j<str.length();j++)
{
if(str[j]>'9') {str[j]='0';str[j+1]+=1;x='1';}//在上一个for循环中str[i+1]已经+1;所以此处无需再加t
else {x='0';}
vec.push_back(str[j]);//i变为i+1,j=i时,str[j]==str[i+1],再上一个for循环中已进1位
}
if(j==str.length()&&x=='1') {vec.push_back(x);}
}
else if(i==str.length())
{
if(t=='1') {vec.push_back(t);}
}
reverse(vec.begin(),vec.end());
cout<<"Case "<<k++<<":"<<endl;
cout<<str2<<" + "<<str3<<" = ";
for(i=0;i<vec.size();i++)
{
cout<<vec[i];
}
cout<<endl;
if(n>0) cout<<endl;

}
}
return 0;
}


还有另外一种方法,就是把每两组字符串分别转化为数字存在两个容器内,再把两个容器内的数据相加用另一个容器保存,这样子写代码会简洁一些。

代码如下:#include<iostream> //大数相加
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> add(vector<int> v1,vector<int> v2)
{
int i,t,first,n;
if(v1.size()<v2.size()) {swap(v1,v2);}
vector<int> v3;
first=t=0;
for(i=0;i<v1.size();i++)
{
if(i<v1.size()) {t+=v1[i];}
if(i<v2.size()) {t+=v2[i];}
first=t/10;
t=t%10;
v3.push_back(t);
t=first;
}
if(t>0) {v3.push_back(t);}
return v3;
}
int main()
{
int i,n,k,m;
string str,str1,str2,str3;
vector<int> v1,v2,v3;
while(cin>>m)
{
k=1;
while(m--)
{
cin>>str>>str1;
v1.clear();
v2.clear();
v3.clear();
str2=str;str3=str1;
for(i=str.length()-1;i>=0;i--)//倒着输入
{
n=str[i]-'0';
v1.push_back(n);
}
for(i=str1.length()-1;i>=0;i--)
{
n=str1[i]-'0';
v2.push_back(n);
}
v3=add(v1,v2);
cout<<"Case "<<k++<<":"<<endl;
cout<<str2<<" + "<<str3<<" = ";
for(i=v3.size()-1;i>=0;i--)
cout<<v3[i];
cout<<endl;
if(m!=0) {cout<<endl; }
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: