首页 > 代码库 > 高精度特别策划 加减乘除余~~~

高精度特别策划 加减乘除余~~~

P1932 A+B & A-B & A*B & A/B Problem

 

题目背景

这个题目很新颖吧!!!

题目描述

求A、B的和差积商余!

输入输出格式

输入格式:

 

两个数两行

A B

 

输出格式:

 

五个数

和 差 积 商 余

 

输入输出样例

输入样例#1:
11
输出样例#1:
20110

说明

length(A),length(B)<=10^4

每个点3s。

 

代码

  1 #include <iostream>  2 #include <cstdlib>  3 #include <cstdio>  4 #include <string>  5   6 using namespace std;  7   8 typedef int hp[20002];  9 hp a,b,c,d; 10 int l1,l2,l3,i,code; 11 string n1,n2; 12 void init(hp a) { 13     string s; 14     int i; 15     memset(a,0,sizeof(int)*20002); 16     cin >> s; 17     a[0] = s.length(); 18     for(i=1;i<=a[0];i++) { 19         a[i]=s[a[0]-i]-48; 20     }  21 } 22  23 void print(hp a) { 24     int i; 25     for(int i=a[0]; i>=1; i--) cout << a[i]; 26     cout << endl; 27 } 28  29 void clear(hp a) { 30     int i; 31     for(int i=1;i<=a[0];i++) { 32         a[i+1]+=a[i]/10; 33         a[i]%=10; 34     } 35     while((a[a[0]]==0) && (a[0]>1)) a[0]--; 36 } 37  38 int compare(hp a, hp b) { 39     int i; 40     clear(a); 41     clear(b); 42     if(a[0]>b[0]) { 43         return 1; 44     } 45     if(a[0]<b[0]) { 46         return -1; 47     } 48     for(i=a[0]; i>=1; i--) { 49         if(a[i]>b[i]) { 50             return 1; 51         } 52         if(a[i]<b[i]) { 53             return -1; 54         } 55     } 56     return 0; 57 } 58  59 void plus1(hp a, hp b, hp c) { 60     int i; 61     memcpy(c,a,sizeof(int)*20002); 62     if(b[0]>c[0]) c[0]=b[0]; 63     for(int i=1;i<=b[0];i++) { 64         c[i]+=b[i]; 65     } 66     c[0]++; 67     clear(c); 68 } 69  70 void minus1(hp a, hp b, hp c) { 71     int i; 72     hp t; 73     bool flag = false; 74     if(compare(a,b)<0) { 75         memcpy(c,b,sizeof(int)*20002); 76         memcpy(t,b,sizeof(int)*20002); 77         memcpy(b,a,sizeof(int)*20002); 78         flag = true; 79     } else memcpy(c,a,sizeof(int)*20002); 80     for(i=1;i<=c[0];i++) { 81         c[i+1]--; 82         c[i]+=10-b[i]; 83     } 84     clear(c); 85     if(flag) memcpy(b,t,sizeof(int)*20002); 86 } 87  88 void multiply(hp a, hp b, hp c) { 89     int i,j; 90     memset(c, 0, sizeof(int)*20002); 91     for(i=1; i<=a[0];i++)  92         for(j=1;j<=b[0];j++) 93             c[i+j-1]+=a[i]*b[j]; 94     c[0]=a[0]+b[0]; 95     clear(c); 96 } 97  98 void divide(hp a, hp b, hp c, hp d) { 99     int i,j,p;100     memset(c, 0, sizeof(int)*20002);101     memset(d, 0, sizeof(int)*20002);102     c[0]=a[0]; d[0]=1;103     for(j=a[0]; j>=1;j--) {104         d[0]++;105         for(p=d[0];p>=2;p--) {106             d[p]=d[p-1];107         }108         d[1]=a[j];109         while(compare(d,b)>=0) {110             c[j]++;111             minus1(d,b,d);112         }113     }114     clear(c);115     clear(d);116 }117 118 int main() {119     init(a);120     init(b);121     plus1(a,b,c);122     print(c);123     minus1(a,b,c);124     print(c);125     multiply(a,b,c);126     print(c);127     divide(a,b,c,d);128     print(c);129     print(d);130 }

 

高精度特别策划 加减乘除余~~~