大数相乘
2013-06-04 21:33
309 查看
/* 本程序假设所输入的大数均在20位以内,并且输入数字时候假定不出现非法情况(例如不存在这样情况123a78ty等) 这里只完成了大数的乘法运算 */ #include "stdio.h" #define MAX 21 void InputNumber(int []); //输入大数 void InitNumber(int []); //初始化用于存放结果的数组 void Multi(int [],int [],int []); //进行大数乘法 void singleMulti(int [],int,int []); //对大数乘以一位数的函数 void Add(int [],int []); //对结果进行错位相加 void printresult(int []); //输出结果 void main() { //largenumber1[]和largenumber2[]表示要相乘的大数,mResult[]表示结果存放的数组,显然其位数不会超过2 * (MAX - 1) int largenumber1[MAX],largenumber2[MAX],mResult[2 * MAX -1]; printf("Input the first number:\n"); InputNumber(largenumber1); printf("Input the second number:\n"); InputNumber(largenumber2); InitNumber(mResult); Multi(largenumber1,largenumber2,mResult); printf("The result is:\n"); printresult(mResult); getchar(); } void InputNumber(int largenumber[]) { char numberchar; int i = 0; scanf("%c",&numberchar); while(numberchar != '\n' && i < MAX) //最初输入大数用字符串表示 { largenumber[++i] = numberchar - '0'; scanf("%c",&numberchar); } largenumber[0]=i; //largenumber[0]表示大数的有多少位 } void InitNumber(int result[]) { for(int i = 0; i < 2 * MAX - 1; i++) result[i]=-1; //赋初值为-1非常高明 } void Multi(int number1[],int number2[],int result[]) { int i; int temper[2 * MAX - 1]; for(i = number2[0];i>=1;i--)//number2[0]记录number2[ ]大数到底有多少位 { singleMulti(number1,number2[i],temper); Add(result,temper); } } void singleMulti(int number1[],int number2,int temper[]) { int i,t = 0,c = 2 * MAX - 2; for(i=number1[0];i>=1;i--)//number2[0]记录number2[ ]大数到底有多少位 t表进位 { int tempernumber = number2 * number1[i]; temper[c--] = (tempernumber + t) % 10; t = (int)((tempernumber + t) / 10); } if (t > 0) { temper[c] = t; temper[0] = 2 * MAX - 2 - c + 1;//temper[0]记录所得的积最高位的确切位置, //此时为有进位的情况 } else temper[0] = 2 * MAX -2 - c; } void Add(int result[],int temper[]) { static int pos = 2 * MAX - 2; //pos用来定位位置,用静态变量,别有一番用意 int c = pos,t = 0; for(int i = 2 * MAX - 2; i > 2 * MAX - 2 - temper[0]; i--) { if (result[c] == -1) result[c] = 0; int tempernumber = result[c] + temper[i]; result[c--] = (tempernumber + t) % 10; t = (int)(tempernumber / 10); } if (t == 1) result[c] = 1; pos--; } void printresult(int result[]) { for(int i = 1; i < 2 * MAX - 1 ; i++) if (result[i] != -1) printf("%d",result[i]); }