高精度特别策划 加减乘除余~~~
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);
}
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

浙公网安备 33010602011771号