[ CodeVS冲杯之路 ] P3117
不充钱,你怎么AC?
题目:http://codevs.cn/problem/3117/
啊啊啊,基础的高精度乘法被我写得又臭又长,以后再来优化代码(DP着哪天能够把加减乘除全部写一边贴上来,哦对还有开根)
这里依然使用的是模拟手算
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 9 const int N=600; 10 char s[N*2],c[N*2],now[N],x[N],y[N]; 11 void Plus(char *c,char *a,char *b) 12 { 13 int la,lb,i=0,k; 14 while (c[i]!='\0') c[i++]='\0'; 15 la=strlen(a)-1; 16 lb=strlen(b)-1; 17 i=max(la,lb)+1; 18 k=0; 19 while (i>=0) 20 { 21 if (la>=0) k+=a[la--]-'0'; 22 if (lb>=0) k+=b[lb--]-'0'; 23 c[i--]=k%10+'0'; 24 k/=10; 25 } 26 if (c[0]!='1') while (c[++i]!='\0') c[i]=c[i+1]; 27 } 28 void multy() 29 { 30 int i=strlen(x)-1,j=strlen(y)-1,la,lb,k,l; 31 la=i; 32 lb=j; 33 for (;i>=0;i--) 34 { 35 for (j=lb;j>=0;j--) 36 { 37 k=(x[i]-'0')*(y[j]-'0'); 38 if (k>9) 39 { 40 now[1]=k%10+'0'; 41 now[0]=k/10+'0'; 42 l=2; 43 } 44 else 45 { 46 now[0]=k+'0'; 47 l=1; 48 } 49 k=la-i+lb-j; 50 while (k>0) 51 { 52 k--; 53 now[l++]='0'; 54 } 55 now[l]='\0'; 56 strcpy(c,s); 57 Plus(s,c,now); 58 } 59 } 60 } 61 int main() 62 { 63 int i; 64 i=0; 65 while ((x[i++]=getchar())!=' '); 66 i--; 67 x[i]='\0'; 68 i=0; 69 while ((y[i++]=getchar())!='\n'); 70 i--; 71 y[i]='\0'; 72 multy(); 73 puts(s); 74 return 0; 75 }