大数乘法(适合k进制)
1 #include<stdio.h> 2 #include<string.h> 3 #define N 10000 4 void inv(char str[],int n) 5 { 6 int i,j; 7 char temp; 8 for(i=0,j=n-i-1; i<j; i++,j--) 9 temp=str[i],str[i]=str[j],str[j]=temp; 10 } 11 char* bigX(char *str,char *ttr,int num) 12 { 13 int a,s[N],k,flag = 0; 14 if(str[0]=='0'||ttr[0]=='0') 15 { 16 return "0"; 17 } 18 if(str[0]=='-') 19 { 20 strcpy(str,str+1); 21 flag++; 22 } 23 if(ttr[0]=='-') 24 { 25 strcpy(ttr,ttr+1); 26 flag++; 27 } 28 int len1=strlen(str); 29 int len2=strlen(ttr); 30 inv(str,len1); 31 inv(ttr,len2); 32 for(int i=0; i<=len1+len2+100; i++) 33 s[i]=0; 34 for(int i=0; i<len1; i++) 35 for(int j=0; j<len2; j++) 36 s[i+j]=s[i+j]+(str[i]-'0')*(ttr[j]-'0'); 37 for(int i=0; i<=len1+len2+100; i++) 38 if(s[i]>=8) 39 { 40 a=s[i]/num; 41 s[i]=s[i]%num; 42 s[i+1]=s[i+1]+a; 43 } 44 k=len1+len2; 45 for(int i=k; i>0; i--) 46 if(s[i]==0) 47 k=i-1; 48 else 49 break; 50 if(flag==1) 51 { 52 str[0]='-'; 53 for(int i=k,j=1; i>=0; i--,j++) 54 { 55 str[j]=s[i]+'0'; 56 } 57 } 58 else 59 { 60 for(int i=k,j=0; i>=0; i--,j++) 61 { 62 str[j]=s[i]+'0'; 63 } 64 } 65 return str; 66 } 67 int main() 68 { 69 char str[N],ttr[N]; 70 while(1) 71 { 72 if(scanf("%s%s",str,ttr)==EOF) 73 break; 74 puts(bigX(str,ttr,8)); 75 memset(str,0,sizeof(str)); 76 memset(ttr,0,sizeof(ttr)); 77 } 78 return 0; 79 }