高精度算法-面向对象
高精度算法-面向对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| #include<bits/stdc++.h> using namespace std; class B { private: string s; int num[1100],len; public: friend void input(B); friend void output(B); B() { s=""; len=0; memset(num,0,sizeof(num)); } B(string a) { s=a; len=s.size(); for(int i=0; i<len; i++)num[i]=s[len-i-1]-'0'; } bool operator >=(const B& a) { if(len>a.len)return true; if(len==a.len)for(int i=len-1; i>=0; i--) { if(num[i]>a.num[i])return true; else if(num[i]<a.num[i])return false; } return true; } B& operator =(const B& a) { this->len=a.len; this->s=a.s; for(int i=0; i<len; i++)this->num[i]=a.num[i]; return*this; } B operator +(B b) { B tmp; tmp.len=max(len,b.len); for(int i=0; i<max(len,b.len); i++) { tmp.num[i]+=b.num[i]+num[i]; tmp.num[i+1]+=tmp.num[i]/10; tmp.num[i]%=10; } if(tmp.num[tmp.len]>0)tmp.len++; return tmp; } B operator -(B b) { B tmp; tmp.len=max(len,b.len); for(int i=0; i<tmp.len; i++) { tmp.num[i]=num[i]-b.num[i]; if(tmp.num[i]<0) { tmp.num[i+1]--; tmp.num[i]+=10; } } while(tmp.num[tmp.len-1]==0&&tmp.len>1)tmp.len--; return tmp; } B operator *(B b) { B tmp; tmp.len=len+b.len+1; for(int i=0; i<len; i++) { for(int j=0; j<b.len; j++) { tmp.num[i+j]+=num[i]*b.num[j]; tmp.num[i+j+1]+=tmp.num[i+j]/10; tmp.num[i+j]%=10; } } while(tmp.num[tmp.len-1]==0&&tmp.len>1)tmp.len--; return tmp; } B operator /(B b) { B tmp,ans("0"); B one("0"); tmp.len=len; for(int i=0; i<len; i++)tmp.num[i]=num[i]; int diff=len-b.len; for(int i=tmp.len-1; i>=b.len-1; i--) { B t; t.len=b.len; for(int j=i+1-b.len; j<=i; j++){ t.num[j-diff]=tmp.num[j]; } while(t>=b) { for(int j=i+1-b.len; j<=i; j++) { tmp.num[j]-=b.num[j-diff]; if(tmp.num[j]<0){ tmp.num[j]+=10; tmp.num[j+1]--; } t.num[j-diff]=tmp.num[j]; } one.num[i-b.len+1]=1; one.len=i-b.len+2; ans=ans+one; } one.num[i-b.len+1]=0; diff--; if(i>0&&tmp.num[i]>0)tmp.num[i-1]+=tmp.num[i]*10; } return ans; } }; void input(B a) { cin>>a.s; a.len=a.s.size()-1; for(int i=0; i<=a.len; i--) { a.num[i]=a.s[a.len-i]-'0'; } } void output(const B a) { for(int i=a.len-1; i>=0; i--) { cout<<a.num[i]; } } int main() { B a("1816324242342"); B b("233333"); B c=a/b; output(c); return 0; }
|