P1932 A+B & A-B & A*B & A/B Problem
题目背景
这个题目很新颖吧!!!
题目描述
求A、B的和差积商余!
输入输出格式
输入格式:
两个数两行
A B
输出格式:
五个数
和 差 积 商 余
输入输出样例
输入样例#1:
1 1
输出样例#1:
2 0 1 1 0
说明
length(A),length(B)<=10^4
每个点3s。
代码
#include <iostream> #include <cstdlib> #include <cstdio> #include <string> using namespace std; typedef int hp[20002]; hp a,b,c,d; int l1,l2,l3,i,code; string n1,n2; void init(hp a) { string s; int i; memset(a,0,sizeof(int)*20002); cin >> s; a[0] = s.length(); for(i=1;i<=a[0];i++) { a[i]=s[a[0]-i]-48; } } void print(hp a) { int i; for(int i=a[0]; i>=1; i--) cout << a[i]; cout << endl; } void clear(hp a) { int i; for(int i=1;i<=a[0];i++) { a[i+1]+=a[i]/10; a[i]%=10; } while((a[a[0]]==0) && (a[0]>1)) a[0]--; } int compare(hp a, hp b) { int i; clear(a); clear(b); if(a[0]>b[0]) { return 1; } if(a[0]<b[0]) { return -1; } for(i=a[0]; i>=1; i--) { if(a[i]>b[i]) { return 1; } if(a[i]<b[i]) { return -1; } } return 0; } void plus1(hp a, hp b, hp c) { int i; memcpy(c,a,sizeof(int)*20002); if(b[0]>c[0]) c[0]=b[0]; for(int i=1;i<=b[0];i++) { c[i]+=b[i]; } c[0]++; clear(c); } void minus1(hp a, hp b, hp c) { int i; hp t; bool flag = false; if(compare(a,b)<0) { memcpy(c,b,sizeof(int)*20002); memcpy(t,b,sizeof(int)*20002); memcpy(b,a,sizeof(int)*20002); flag = true; } else memcpy(c,a,sizeof(int)*20002); for(i=1;i<=c[0];i++) { c[i+1]--; c[i]+=10-b[i]; } clear(c); if(flag) memcpy(b,t,sizeof(int)*20002); } void multiply(hp a, hp b, hp c) { int i,j; memset(c, 0, sizeof(int)*20002); for(i=1; i<=a[0];i++) for(j=1;j<=b[0];j++) c[i+j-1]+=a[i]*b[j]; c[0]=a[0]+b[0]; clear(c); } void divide(hp a, hp b, hp c, hp d) { int i,j,p; memset(c, 0, sizeof(int)*20002); memset(d, 0, sizeof(int)*20002); c[0]=a[0]; d[0]=1; for(j=a[0]; j>=1;j--) { d[0]++; for(p=d[0];p>=2;p--) { d[p]=d[p-1]; } d[1]=a[j]; while(compare(d,b)>=0) { c[j]++; minus1(d,b,d); } } clear(c); clear(d); } int main() { init(a); init(b); plus1(a,b,c); print(c); minus1(a,b,c); print(c); multiply(a,b,c); print(c); divide(a,b,c,d); print(c); print(d); }