C C++实现两个大数相乘.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Question:

(1),用一个整型数组表示一个大数,数组的每个元素储存大数的一位数字,则实际的大数d表示为: d=a[k]*10的k-1次幂+a[k-1]*10的k-2次幂+......+a[2]*10+a[1] 其中a[0]保存该大数的位数.

(2),实现两个大数相乘.

(3),再此基础上实现两个大数相除

Solution:

/*

本程序假设所输入的大数均在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[ ]大数到底有多少位

{

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]);

}

示例结果为:

/*日期:2005-7-5*/

相关文档
最新文档