大数相乘的一种实现

    基本步骤:输入字符串—>转化为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计算大数的乘积,在此暂不探讨。

posted on 2013-08-07 18:21  buptpatriot  阅读(175)  评论(2编辑  收藏  举报

导航