a+b和a-b

xiaoxiao2021-02-28  404

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; }

转载请注明原文地址: https://www.6miu.com/read-24692.html

最新回复(0)