1306: a+b和a-b [模擬]
時間限制: 1 Sec 內存限制: 128 MB提交: 60 解決: 14
題目描述
給你兩個數a和b,讓你計算a和b的和或者差。
輸入
有t組數據,每組數據輸入一個正數a,接着輸入一個符號('+'或者'-'),再輸入一個正數b。
a和b的位數都小於100位。
輸出
若是'+',輸出兩個數之和,若是'-',輸出兩數之差。
樣例輸入
4
12345 + 12345
12345 + 35
2345 - 12345
12 - 123
樣例輸出
24690
12380
-10000
-111
提示
注意:a和b很大,用int或者long long無法存儲。
題解:兩個數組相加時 大於10向前進1 同時本身減10 相減分情況討論:第一種情況:在第一個數組大於等於第二個數組的長度時若第一個數組減第二個數組後最後一個爲-1
則用第二個數組減第一個數組,同時若爲負數加10 同時下一位減1 若第一個數組小於第二個數組則直接用第二個數組減第一個數組,原理同上。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[110],b[110];
int a1[110],b1[110],c1[110];
int main()
{
int t;
char cor;
scanf("%d",&t);
while(t--){
scanf("%s %c %s",&a,&cor,&b);
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
for(int i=0;i<strlen(a);i++){
a1[strlen(a)-i-1]=a[i]-'0';
c1[strlen(a)-i-1]=a[i]-'0';
}
for(int i=0;i<strlen(b);i++){
b1[strlen(b)-i-1]=b[i]-'0';
}
int len=max(strlen(a),strlen(b));
if(cor=='+'){
for(int i=0;i<len;i++){
a1[i]=a1[i]+b1[i];
if(a1[i]>=10){
int t=a1[i]/10;
a1[i+1]+=t;
a1[i]=a1[i]-t*10;
}
}
if(a1[len]!=0) printf("%d",a1[len]);
for(int i=len-1;i>=0;i--){
printf("%d",a1[i]);
}
}else{
if(strlen(a)<strlen(b)){
for(int i=0;i<len;i++){
b1[i]=b1[i]-a1[i];
if(b1[i]<0){
b1[i]+=10;
b1[i+1]--;
}
}
printf("-");
int i;
for(i=len-1;b1[i]==0;i--);
for(;i>=0;i--){
printf("%d",b1[i]);
}
}
else{
for(int i=0;i<len;i++){
c1[i]=c1[i]-b1[i];
if(c1[i]<0){
c1[i]+=10;
c1[i+1]--;
}
}
if(c1[len]==-1){
printf("-");
for(int i=0;i<len;i++){
b1[i]=b1[i]-a1[i];
if(b1[i]<0){
b1[i]+=10;
b1[i+1]--;
}
}
int i;
for(i=len-1;b1[i]==0;i--);
for(;i>=0;i--){
printf("%d",b1[i]);
}
}else{
int i;
for(i=len-1;c1[i]==0;i--);
for(;i>=0;i--){
printf("%d",c1[i]);
}
}
}
}
printf("\n");
}
return 0;
}