QDUOJ596 A+B Problem and A*B Problem 大整数与小整数相加与相乘

题意:给你两数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
#include
#include
#include
#include
#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.

你可能感兴趣的:(思维题)