1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <string> 6 #include <vector> 7 #include <map> 8 #include <set> 9 #include <queue> 10 #include <list> 11 #include <cstdlib> 12 #include <iterator> 13 #include <cmath> 14 #include <iomanip> 15 #include <bitset> 16 #include <cctype> 17 18 using namespace std; 19 #define cin_1(a) scanf("%d",&a) 20 #define cin_2(a,b) scanf("%d%d",&a,&b) 21 #define cin_3(a,b,c) scanf("%d%d%d",&a,&b,&c) 22 #define max_2(a,b) a>b?a:b 23 #define max_3(a,b,c) max_2(max_2(a,b),c) 24 #define ll long long 25 #define rint register int 26 #define mem0(x) memset(x, 0, sizeof(x)) 27 #define mem1(x) memset(x, -1, sizeof(x)) 28 inline int read()///神奇的读优 29 { 30 int x=0,f=1;char c=getchar(); 31 while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} 32 while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} 33 return x*f; 34 } 35 const int inf = 0x3f3f3f3f; 36 const ll inff = 0x3f3f3f3f3f3f3f3f; 37 //map<ll,ll>mp; 38 //set<ll>st; 39 /***********************************************/ 40 bool judge(string str1,string str2)///是否str1小于str2 41 { 42 int len1=str1.length(); 43 int len2=str2.length(); 44 if(len1<len2 || (len1==len2 && str1<str2)) return 1; 45 return 0; 46 } 47 48 string add(string str1,string str2)///高精度加法 49 { 50 string str; 51 vector<int>x,y; 52 int len1=str1.length(); 53 int len2=str2.length(); 54 int len=max(len1,len2); 55 for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-‘0‘); 56 for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-‘0‘); 57 for(int i=0;i<len;i++) 58 { 59 if(i<len1 && i<len2) x[i]+=y[i]; 60 else if(i>=len1 && i<len2) x.push_back(y[i]); 61 } 62 for(int i=0;i<len-1;i++)///进位 63 if(x[i]>=10) { x[i+1]+=x[i]/10; x[i]%=10; } 64 if(x[len-1]>=10){ 65 x.push_back(x[len-1]/10); 66 x[len-1]%=10; 67 len++; 68 } 69 for(int i=len-1;i>=0;i--) str+=x[i]+‘0‘; 70 return str; 71 } 72 73 string sub(string str1,string str2)///高精度减法 74 { 75 int f=0; 76 string str; 77 vector<int>x,y; 78 int len1=str1.length(); 79 int len2=str2.length(); 80 if(len1<len2 || (len1==len2 && str1<str2)){swap(str1,str2);swap(len1,len2);f=1;} 81 for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-‘0‘); 82 for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-‘0‘); 83 for(int i=0;i<len2;i++) x[i]-=y[i]; 84 for(int i=0;i<len1-1;i++) if(x[i]<0){x[i+1]--;x[i]+=10;}///进位 85 while(x[len1-1]==0 && len1>1) len1--;///去前导0 86 if(f) str+=‘-‘; 87 for(int i=len1-1;i>=0;i--) str+=‘0‘+x[i]; 88 return str; 89 } 90 91 string mul(string str1,string str2)///高精度乘法 92 { 93 string str; 94 str+=‘0‘; 95 vector<int>x,y; 96 int len1=str1.length(); 97 int len2=str2.length(); 98 for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-‘0‘); 99 for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-‘0‘); 100 for(int i=0;i<len1;i++) 101 { 102 int yy=len2; 103 vector<int>z; 104 for(int j=0;j<len2;j++) z.push_back(x[i]*y[j]); 105 for(int j=0;j<len2-1;j++) if(z[j]>=10) {z[j+1]+=z[j]/10; z[j]%=10; }///进位 106 while(z[len2-1]>=10) { z.push_back(z[len2-1]/10);z[len2-1]%=10;len2++; } 107 for(int k=1;k<=i;k++) z.push_back(0); 108 for(int k=len2-1;k>=0;k--) swap(z[k],z[k+i]); 109 len2+=i; 110 while(z[len2-1]==0 && len2>1) len2--;///去前导0 111 string t; 112 for(int ii=len2-1;ii>=0;ii--) t+=‘0‘+z[ii]; 113 str=add(str,t); 114 len2=yy; 115 } 116 return str; 117 } 118 119 string div(string str1,string str2) ///高精度除法 str1/str2 120 { 121 string str,t; 122 int len1=str1.length(); 123 int len2=str2.length(); 124 for(int i=0;i<len1;i++) 125 { 126 t+=str1[i]; 127 string g; 128 for(int k=1;k<=10;k++)///试商 129 { 130 g=‘0‘+k; 131 if(judge(t,mul(g,str2))) ///试商成功 132 { 133 if(str.length()==0 && k==1) ; 134 else str+=‘0‘+k-1;///商为 k-1 135 g=‘0‘+k-1; 136 t=sub(t,mul(g,str2)); 137 if(t[0]==‘0‘) t=""; 138 break; 139 } 140 } 141 } 142 if(str.length()==0) str+=‘0‘; 143 return str; 144 } 145 146 int main() { 147 148 return 0; 149 }
原文地址:https://www.cnblogs.com/liuyongliu/p/10295707.html
时间: 2024-10-12 21:38:24