数组高精度
定义:
int N[20000], len, flag; bignum() { memset(N,0,sizeof(N)); len = 0; flag = 1; }
赋值运算:
void operator =(long long a) { int i=0; while(a!=0) { N[i]=a%10; a/=10; i++; } len=i;} void operator = (string g) { for(int i=0;i<g.size();i++) N[i]=g[g.size()-1-i]-48; len=g.size();}
输出:
void pt() { if(flag==0) printf("-"); for(int i=len;i>=0;i--) printf("%d",N[i]); }
三则运算:
friend bignum operator + (bignum f,bignum g) { bignum ans; ans.len=max(f.len,g.len)+1; int tp=0; for(int i=0;i<=ans.len;i++) { ans.N[i]=f.N[i]+g.N[i]+tp; tp=ans.N[i]/10; ans.N[i]%=10; } int i=ans.len; while(ans.N[i]==0&&i>0) { ans.len--; i--; } return ans; } friend bignum operator * (bignum f,bignum g) { bignum ans; ans.len=f.len+g.len; int tp=0; for(int i=0;i<f.len;i++) { for(int j=0;j<g.len;j++) { ans.N[i+j]+=f.N[i]*g.N[j]; ans.N[i+j+1]+=ans.N[i+j]/10; ans.N[i+j]%=10; } } int i=ans.len; while(ans.N[i]==0&&i>0) { ans.len--; i--; } return ans; } friend bignum operator - (bignum f,bignum g) { bignum ans; if(f<g) { swap(f,g); ans.flag=0; } ans.len=max(f.len,g.len); for(int i=0;i<f.len;i++) { ans.N[i]=f.N[i]-g.N[i]; if(ans.N[i]<0) { f.N[i+1]--; ans.N[i]+=10; } } int i=ans.len; while(ans.N[i]==0&&i>0) { ans.len--; i--; } return ans; }
比较运算:
friend bool operator < (bignum f,bignum g) { if(f.len<g.len) return true; else if(f.len==g.len) { bool flg=1; for(int i=0;i<g.len;i++)if(f.N[i]<g.N[i]) return true; return false; } else return false; }
完整代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 7 struct bignum 8 { 9 int N[20000],len,flag; 10 11 bignum() 12 { 13 memset(N,0,sizeof(N)); 14 len=0; 15 flag=1; 16 } 17 18 void operator =(long long a) 19 { 20 int i=0; 21 while(a!=0) 22 { 23 N[i]=a%10; 24 a/=10; 25 i++; 26 } 27 len=i; 28 } 29 30 void operator = (string g) 31 { 32 for(int i=0;i<g.size();i++) N[i]=g[g.size()-1-i]-48; 33 len=g.size(); 34 } 35 36 friend bignum operator + (bignum f,bignum g) 37 { 38 bignum ans; 39 ans.len=max(f.len,g.len)+1; 40 int tp=0; 41 for(int i=0;i<=ans.len;i++) 42 { 43 ans.N[i]=f.N[i]+g.N[i]+tp; 44 tp=ans.N[i]/10; 45 ans.N[i]%=10; 46 } 47 int i=ans.len; 48 while(ans.N[i]==0&&i>0) 49 { 50 ans.len--; 51 i--; 52 } 53 return ans; 54 } 55 56 friend bignum operator * (bignum f,bignum g) 57 { 58 bignum ans; 59 ans.len=f.len+g.len; 60 int tp=0; 61 for(int i=0;i<f.len;i++) 62 { 63 for(int j=0;j<g.len;j++) 64 { 65 ans.N[i+j]+=f.N[i]*g.N[j]; 66 ans.N[i+j+1]+=ans.N[i+j]/10; 67 ans.N[i+j]%=10; 68 } 69 } 70 int i=ans.len; 71 while(ans.N[i]==0&&i>0) 72 { 73 ans.len--; 74 i--; 75 } 76 return ans; 77 } 78 79 friend bignum operator - (bignum f,bignum g) 80 { 81 bignum ans; 82 if(f<g) 83 { 84 swap(f,g); 85 ans.flag=0; 86 } 87 88 ans.len=max(f.len,g.len); 89 for(int i=0;i<f.len;i++) 90 { 91 ans.N[i]=f.N[i]-g.N[i]; 92 if(ans.N[i]<0) 93 { 94 f.N[i+1]--; 95 ans.N[i]+=10; 96 } 97 } 98 int i=ans.len; 99 while(ans.N[i]==0&&i>0) 100 { 101 ans.len--; 102 i--; 103 } 104 return ans; 105 } 106 107 friend bool operator < (bignum f,bignum g) 108 { 109 if(f.len<g.len) return true; 110 else if(f.len==g.len) 111 { 112 bool flg=1; 113 for(int i=0;i<g.len;i++)if(f.N[i]<g.N[i]) return true; 114 return false; 115 } else return false; 116 } 117 118 void pt() 119 { 120 if(flag==0) printf("-"); 121 for(int i=len;i>=0;i--) printf("%d",N[i]); 122 } 123 }; 124 125 int main() { 126 bignum A,B; 127 long long a,b; 128 cin>>a>>b; 129 A=a; 130 B=b; 131 bignum ans; 132 ans=A-B; 133 ans.pt(); 134 return 0; 135 }
时间: 2024-11-25 18:56:26