高精度特别策划 加减乘除余~~~
Posted Radiumlrb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度特别策划 加减乘除余~~~相关的知识,希望对你有一定的参考价值。
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。
代码
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 }
以上是关于高精度特别策划 加减乘除余~~~的主要内容,如果未能解决你的问题,请参考以下文章