码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-09-10 23:47:56      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

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

标签:

原文地址:http://www.cnblogs.com/radiumlrb/p/5860445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!