大数相乘的一种实现

    基本步骤:输入字符串—>转化为int数组—>数组相乘。

#include <stdio.h>

#include <string.h>

#include <windows.h>



//将字符转换为int

int chartoint(char a){

return a-'0';

}



//将int转换为字符

/* char inttochar(int i){

return i+'0';

}  */



void stoi(char s[],int len,int out_int[]){

for(int k=0;k<len;k++){

if(chartoint(s[k])>=0&&chartoint(s[k])<=9){

out_int[k] = chartoint(s[k]);

}

else {

//输入的字符不是数字时退出程序。

printf("error!");

exit(1);

}

}

}



void  mul(int a[],int b[],int len_a,int len_b,int result[])

{

for(int i=0;i<len_a;i++){

  for(int j=0;j<len_b;j++){

    result[len_a+len_b-1-i-j]+=a[len_a-1-i]*b[len_b-1-j];

  }  

}

for(int i=0;i<len_a+len_b-1;i++){

  result[len_a+len_b-2-i] += result[len_a+len_b-1-i]/10;

  result[len_a+len_b-1-i] %=10;

}

}



void print_res(int res[],int len){

res[0]==0?:printf("%d",res[0]);

for(int i=1;i<len;i++){

printf("%d",res[i]);

}

printf("\n");

}



void main(){

char * a;

char * b;

printf("input a:");

scanf("%s",a);

printf("input b:");

scanf("%s",b); 



DWORD dwStart = GetTickCount();



int len_a = strlen(a);

int len_b = strlen(b);



int *a_int = (int *)calloc(len_a,sizeof(int));

int *b_int = (int *)calloc(len_b,sizeof(int));

int *result = (int *)calloc(len_a+len_b,sizeof(int));



stoi(a,len_a,a_int);

stoi(b,len_b,b_int);



mul(a_int,b_int,len_a,len_b,result);

printf("a*b=");

print_res(result,len_a+len_b);



free(result);

free(a_int);

free(b_int);

result = NULL;

a_int = NULL;

b_int = NULL; 



DWORD dwEnd = GetTickCount();

printf("time used:%d ms",dwEnd-dwStart);

}

    这里只是提供了一种实现。当然还有更好的算法,比如利用FFT计算大数的乘积,在此暂不探讨。

你可能感兴趣的:(实现)