A + B Problem II
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 32082 Accepted Submission(s): 5683
2 1 2 112233445566778899 998877665544332211
Case 1: 1 + 2 = 3 Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110
我的代码:
#include<iostream>
#include<string>
#define max 1000
using namespace std;
int min(int a,int b)
{
if(a>b)return b;
else return a;
}
int main()
{
char a[max],b[max];
int Ia[max],Ib[max],n,i,j,k,lena,lenb,z;
cin>>n;
for(i=0;i<n;i++)
{
k=0;
z=0;
cin>>a>>b;
lena=strlen(a);
lenb=strlen(b);
cout<<"Case "<<i+1<<":"<<endl;
for(j=0;j<lena;j++)cout<<a[j];
cout<<" ";
for(j=0;j<lena;j++)Ia[j]=a[lena-j-1]-48;//转换为整型数组 例如:input: 1234 转换为:4321这样就从个位数开始相加
cout<<"+"<<" ";
for(j=0;j<lenb;j++)cout<<b[j];
cout<<" ";
for(j=0;j<lenb;j++)Ib[j]=b[lenb-j-1]-48;
cout<<"="<<" ";
for(j=0;j<min(lena,lenb);j++)
if(Ia[j]+Ib[j]+k>=10)//k为是否进位的标记
{
Ia[j]=(Ia[j]+Ib[j]+k)-10;
k=1;
}
else
{
Ia[j]=Ia[j]+Ib[j]+k;
k=0;
}
if(lena==min(lena,lenb)&&lena!=lenb)//Ib还有数,而Ia中已经没有数,此时只要再处理Ib中剩余的元素
{
for(j=lena;j<lenb;j++)
if(Ib[j]+k>=10)
{
Ib[j]=Ib[j]+k-10;
k=1;
}
else
{
Ib[j]=Ib[j]+k;
k=0;
}
if(k==1)cout<<k;//做完了Ib中剩余的元素,K还是为1,则说明还有进位直接输出
while(lenb-z-1>=lena)//将Ib中刚刚处理的剩余元素反向输出
{
cout<<Ib[lenb-z-1];
z++;
}
}
if(lenb==min(lena,lenb)&&lena!=lenb)
{
for(j=lenb;j<lena;j++)
if(Ia[j]+k>=10)
{
Ia[j]=Ia[j]+k-10;
k=1;
}
else
{
Ia[j]=Ia[j]+k;
k=0;
}
if(k==1)cout<<k;
}
if(k==1&&lena==lenb)cout<<k;
for(j=lena-1;j>=0;j--)
{
cout<<Ia[j];
if(j==0&&i<n-1){cout<<endl;cout<<endl;}
}
if(i==n-1)cout<<endl;
}
return 0;
}
//这个题目,我做了很久才被AC,原因就是少了几个空格,还有输出的格式~通过这道题目,总结:ACM的题目要非常小心的阅读题目~否则后果很严重~呵呵
浙公网安备 33010602011771号