杭电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;
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;
}
题目大意:有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;
}
相关文章推荐
- 杭电ACM 1002 A + B Problem II
- 杭电1002_A + B Problem II
- 杭电OJ A + B Problem II
- 杭电OJ题 1002 A + B Problem II 解题报告
- 杭电acm 1002 A + B Problem II
- 杭电 hdu 1023——Train Problem II .
- 杭电 HDU 1002 A + B Problem II Java 大数的初级用法
- 杭电ACM OJ 1002 A + B Problem II 大数问题 长整数问题
- 【杭电1002】A + B Problem II
- 杭电1002 A+B Problem(II)
- 【杭电】 1002 A + B Problem II
- 杭电ACM----------1002 A+B problemII
- 杭电1002---A + B Problem II
- 杭电1023——Train Problem II
- 杭电ACM A + B Problem II
- A + B Problem II(杭电1002)
- 喜极而泣!杭电OJ——1002 A + B Problem II
- 杭电ACM第1002题(C语言版)答案——A + B Problem II
- 杭电_ACM_Train Problem II
- 杭电ACM第1002题(A + B Problem II)答案 java版