题意:给你两数a b 让你计算a+b和a*b.
其中a<=10e50 b<=1000
思路:刚开始当作大数乘法加法做了 心态做崩了。昨晚补题的时候pxgg教我的方法:
1、因为B很小(很小的意思是和个位数相乘不会溢出),所以对于乘法,我们利用它的分配律,可以把B看作一个一位数,再逐个与A的每一位相乘,模10为这一位的数值,除以10为进位数值,而继续往下运算的那一位,ans[i]直接为那一位和b的乘积加上进位 再模10除以10就好,对于运算完所有数剩下的进位,按次序赋值过去就好。
2、对于加法,只把b加给最低位,取模进位取模进位即可。
下面是AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define inf 0x3f3f3f3f
#define MID (t[k].l+t[k].r)>>1
#define cl(a,b) memset(a,b,sizeof(a))
using namespace std;//和pxgg学了一招!!!tql
char s[60];
int a[60],ans[60],ans2[60];
int b;
int main(){
scanf("%s",s);
scanf("%d",&b);
int alen=strlen(s);
int a2len=alen;
for(int i=0;i<alen;i++){
a[alen-i]=s[i]-'0';
}
int up2=b;
for(int i=1;i<=a2len;i++){
//if(up2==0) break; 不然前面的赋不上值了。。。
ans2[i]=(up2+a[i])%10;
up2=(up2+a[i])/10;
}
while(up2){
ans2[++a2len]=up2%10;
up2/=10;
}
for(int i=a2len;i>=1;i--){
printf("%d",ans2[i]);
}printf("\n");
int temp,up=0;//temp是当前乘数 up是进位 初始化为0
for(int i=1;i<=alen;i++){
temp=b*a[i];
ans[i]=(up+temp)%10;
up=(up+temp)/10;
}
while(up){
ans[++alen]=up%10;
up/=10;
}
for(int i=alen;i>=1;i--){
printf("%d",ans[i]);
}printf("\n");
return 0;
}
描述
Give you two integer
aa
a and
bb
b, please output
a+ba+b
a+b and
a∗ba*b
a∗b.
输入
Single test.
Each line have two integer
aa
a,
bb
b.
0≤a≤1050 0 \leq a \leq 10^{50}
0≤a≤10
50
0 ≤b≤1000 0 \leq b \leq 1000
0 ≤b≤1000
输出
Output a+b in the first line, and output a*b in the second line.
输入样例 1
1999 10
输出样例 1
2009
19990
提示
Cannot use Java and Python.