codevs 3116 高精加法:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int a[300],b[300],c[300],j=1; char x[300],y[300]; int main(){ cin>>x>>y; a[0]=strlen(x); b[0]=strlen(y); for(int i=1;i<=a[0];i++) a[i]=x[a[0]-i]-'0'; for(int i=1;i<=b[0];i++) b[i]=y[b[0]-i]-'0'; // 以上為輸入數據。 do{ c[j]=a[j]+b[j]+c[j]; if(c[j]>=10) {c[j]=c[j]%10;c[j+1]++;} j++; a[0]--; b[0]--; }while(a[0]>0||b[0]>0); // 以上為高精加法。 while(!c[j]) j--; while(j) {cout<<c[j];j--;} // 以上為輸出。 return 0; }
codevs 3115 高精減法:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; char s1[666],s2[666]; int a[666],b[666],c[666],al,bl,cl,pan=0; int main(){ cin>>s1>>s2; al=strlen(s1); bl=strlen(s2); if(al>bl||(al==bl&&s1[0]>=s2[0])){ for(int i=1;i<=al;i++) a[i]=s1[al-i]-'0'; for(int i=1;i<=bl;i++) b[i]=s2[bl-i]-'0'; } else{ for(int i=1;i<=bl;i++) a[i]=s2[bl-i]-'0'; for(int i=1;i<=al;i++) b[i]=s1[al-i]-'0'; cl=al,al=bl,bl=cl; cout<<"-"; } // 以上為輸入數據。 for(int i=1;i<=al;i++){ if(a[i]<b[i]) {a[i+1]--;a[i]+=10;} c[i]=a[i]-b[i]; } // 以上為高精減法。 while(al&&!c[al]) al--; while(al) {cout<<c[al];al--;pan=1;} if(!pan) cout<<"0"; // 以上為輸出。 cout<<endl; return 0; }
codevs 3117 高精乘法:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 char s1[666],s2[666]; 7 int a[666],b[666],c[666],al,bl,cl; 8 int main(){ 9 cin>>s1>>s2; 10 al=strlen(s1); 11 bl=strlen(s2); 12 for(int i=1;i<=al;i++) 13 a[i]=s1[al-i]-'0'; 14 for(int i=1;i<=bl;i++) 15 b[i]=s2[bl-i]-'0'; 16 // 以上為輸入數據。 17 for(int i=1;i<=al;i++){ 18 for(int j=1;j<=bl;j++){ 19 c[i+j-1]+=a[i]*b[j]; 20 c[i+j]+=c[i+j-1]/10; 21 c[i+j-1]%=10; 22 } 23 } 24 // 以上為高精乘法。 25 cl=al+bl; 26 while(cl>1&&!c[cl]) cl--; 27 while(cl) {cout<<c[cl];cl--;} 28 // 以上為輸出。 29 cout<<endl; 30 return 0; 31 }
codevs 3118 高精除法:
高精除低精(不常用):
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 long long b,s[2][3000],al,l; 6 char a[3000]; 7 void gjcu(){ 8 for(int i=al+100;i>0;i--){ 9 s[0][i]=s[1][i]/b; 10 if(s[1][i]%b) s[1][i-1]+=s[1][i]%b*10; 11 } 12 } 13 int main(){ 14 cin>>a>>b; 15 al=strlen(a); 16 for(int i=1;i<=al;i++) s[1][100+i]=a[al-i]-'0'; 17 gjcu(); 18 l=al+100; 19 while(!s[0][l]&&l>101) l--; 20 for(int i=l;i>100;i--){ 21 if(i==100) printf("."); 22 printf("%lld",s[0][i]); 23 } 24 printf(" "); 25 return 0; 26 }
高精除高精(基本不用):
思路就是把乘法變成減法。(我这个代码洛谷只给70分)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int s[4][3000],al,bl,p,d,ans; 6 char a[3000],b[3000]; 7 int bj(int x,int y){ 8 int i=al; 9 while(s[x][i]==s[y][i]&&i>0) i--; 10 if(s[x][i]<s[y][i]) return -1; 11 if(s[x][i]>s[y][i]) return 1; 12 return 0; 13 } 14 void gjq(){ 15 for(int i=1;i<=bl+1;i++){ 16 s[3][i]-=s[2][i]; 17 if(s[3][i]<0){ 18 s[3][i]+=10; 19 s[3][i+1]-=1; 20 } 21 } 22 } 23 void gjcgj(){ 24 for(int i=al;i>0;i--){ 25 d=0; 26 for(int j=bl+1;j>1;j--) s[3][j]=s[3][j-1]; 27 s[3][1]=s[1][i]; 28 p=bj(3,2); 29 if(p==1){ 30 do{ 31 gjq(); 32 ++d; 33 p=bj(3,2); 34 }while(p==1); 35 } 36 s[0][i]=d; 37 } 38 } 39 int main(){ 40 cin>>a>>b; 41 al=strlen(a);bl=strlen(b); 42 for(int i=1;i<=al;i++) s[1][i]=a[al-i]-'0'; 43 for(int i=1;i<=bl;i++) s[2][i]=b[bl-i]-'0'; 44 if(al<=bl){ 45 p=bj(1,2); 46 if(p==-1||al<bl) {printf("0");return 0;} 47 if(p==0) {printf("1");return 0;} 48 } 49 gjcgj(); 50 ans=al; 51 while(!s[0][ans]) ans--; 52 for(int i=ans;i>0;i--) printf("%d",s[0][i]); 53 printf(" "); 54 return 0; 55 }
使用時建議大家放在函數里。什麼?你也有起名恐懼症,而且高精加和高精減都是gjj,呵呵~