大数相乘

来源:互联网 发布:上海软件开发有限公司 编辑:程序博客网 时间:2024/06/05 21:04
/*本程序假设所输入的大数均在20位以内,并且输入数字时候假定不出现非法情况(例如不存在这样情况123a78ty等)这里只完成了大数的乘法运算*/#include "stdio.h"#define MAX 21void 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]记录所得的积最高位的确切位置,//此时为有进位的情况}elsetemper[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]);}