大数相乘的一种实现
基本步骤:输入字符串—>转化为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) 编辑 收藏 举报