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

高精度 模板 压代码 精简版

时间:2014-11-04 08:04:58      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   使用   for   sp   div   

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 struct bign{
 6     int len;
 7     int num[1501];
 8     bool flag;
 9     bign(){len=1;flag=0;memset(num,0,sizeof num);}
10     bign(int x){
11         if(!x)return;
12         len=0;
13         while(x)num[++len]=x%10;x/=10;
14     }
15 };
16 bool operator < (bign a,bign b){
17     if(a.len<b.len)return 1;
18     if(a.len>b.len)return 0;
19     for(int i=a.len;i>=1;i--)if(a.num[i]>b.num[i])return 0;
20     return 1;
21 }
22 bool operator == (bign a,bign b){
23     if(a.len!=b.len)return 0;
24     for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
25     return 1;
26 }
27 bign operator +(bign &A,bign &B){
28     bign ret;
29     int i=1,x=0;
30     while(i<=A.len || i<=B.len){
31         ret.num[i]=A.num[i]+B.num[i]+x;
32         x=ret.num[i]/10; ret.num[i]%=10; i++;
33     }
34     ret.num[i]=x;  ret.len=i;
35     if(!ret.num[ret.len])ret.len--;
36     return ret;
37 }
38 bign operator * (bign a,bign b){
39     bign ans;
40     int len=a.len+b.len;
41     for(int i=1;i<=a.len;i++){
42         int x=0;
43         for(int j=1;j<=b.len;j++){
44             ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
45             x=ans.num[i+j-1]/10;
46             ans.num[i+j-1]%=10;
47         }
48         ans.num[i+b.len]+=x;
49     }
50     while(!ans.num[len] && len>1)len--;
51     ans.len=len;
52     return ans;
53 }
54 bign operator - (bign a,bign b){
55     bign ans;
56     if(a==b)return ans;
57     if(b<a){
58         for(int i=1;i<=a.len;i++){
59             if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
60             ans.num[i]=a.num[i]-b.num[i];
61             if(ans.num[i]<0){
62                 ans.num[i]+=10; a.num[i+1]--;//向a的高位借位
63             }
64         }
65     }
66     else{
67         ans.flag=1;// this number(I mean the ans) is smaller than zero
68         for(int i=1;i<=b.len;i++){
69             if(b.num[i]<0){
70                 b.num[i]+=10; b.num[i+1]--;
71             }
72             ans.num[i]=b.num[i]-a.num[i];
73             if(ans.num[i]<0){
74                 ans.num[i]+=10; b.num[i+1]--;
75             }
76         }
77     }
78     int len=max(a.len,b.len);
79     while(ans.num[len]<=0 && len>1)len--;
80     ans.len=len;
81     return ans;
82 }

注:本代码已略去bign读入、输出函数(很简单,不必使用函数),主函数已省去~

高精度 模板 压代码 精简版

标签:style   blog   io   color   os   使用   for   sp   div   

原文地址:http://www.cnblogs.com/Skyvot/p/4072676.html

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