1,头文件
#include "stdafx.h"
#define SIZE 1000
#define Get_Array_Len(array,len){len=sizeof(array)/sizeof(array[0]);}
int multiply(int[],int a,int m);
void charToInteger(char ch[],int inter[]);
int add(int a[],int b[],int m,int n,int shift);
void multiplyInBigInteger(int a[],int b[],int m,int n);
2,源文件
#include "stdafx.h"
#include<iostream>
#include"global.h"
using namespace std;
void main()
{
int lenA,lenB;
char a[SIZE];
char b[SIZE];
int inteA[SIZE];
int inteB[SIZE];
printf("***************************\n");
printf(" 大整数的乘法运算 \n");
printf("***************************\n");
printf("请输入大整数A:");
scanf("%s",a);
printf("\n");
printf("请输入大整数B:");
scanf("%s",b);
printf("\n");
charToInteger(a,inteA);
charToInteger(b,inteB);
lenA=strlen(a);
lenB=strlen(b);
multiplyInBigInteger(inteA,inteB,lenA,lenB);
}
/*
功能:完成大整数的相乘,申请一个数组sumarrayA,保存B的倒数第一位与A
相乘的结果,并把它作为最终的输出数组,从B的倒数第二位开始循环与
A相乘后,再移位与A相加。。这里要注意的是数组名作为形参时,相当于
指针,那么形参值改变时,实参的值也会改变B中的元素每次与A相乘时,
A应该保持不变的。所以这里申请了一个nochangearrayA数组,来保存
A原来的值。
*/
void multiplyInBigInteger(int a[],int b[],int m,int n)
{
int sumarrayA[SIZE];
int nochangearrayA[SIZE];
int sumlen=m;
int templenA;
int shiftvalue=0;
for(int i=0;i<m;i++)
{
sumarrayA[i]=a[i];
nochangearrayA[i]=a[i];
}
sumlen=multiply(sumarrayA,b[n-1],m);
for(int i=n-2;i>=0;i--)
{
templenA=multiply(a,b[i],m);
shiftvalue++;
sumlen=add(sumarrayA,a,sumlen,templenA,shiftvalue);
for(int j=0;j<m;j++)
a[j]=nochangearrayA[j];
}
printf("大整数A和B相乘的结果为:");
for (int i=0;i<sumlen;i++)
printf("%d",sumarrayA[i]);
printf("\n");
printf("\n");
}
/*
假设两个大整数A=123445679,B=12345678,
此函数的功能:得到B中的任何一位与A相乘的结果
并返回相乘后,得到数组的长度。
比如:123445679*9=1111011111
注意有进位1。长度也会比A多一个。
*/
int multiply(int arrA[],int b ,int m)
{
int i,j;
int median;
int flag=0;
for(i=m-1;i>=0;i--)
{
median=b*arrA[i]+flag;
flag=median/10;
arrA[i]=median%10;
}
if(flag)
{
for(j=m-1;j>=0;j--)
arrA[j+1]=arrA[j];
arrA[0]=flag;
flag=1;
}
return (m+flag);
}
/*
此函数的功能:的到两个整数移位相加的结果,比如
1234
+134
------ 移位为1,即shift=1
2574
当shift=2时,
1234
+134
------
14634
返回:两个数组相加后的长度
*/
int add(int a[],int b[],int m,int n,int shift)
{
int len;
int length;
int sum[SIZE];
int flag=0;
for(int i=n;i<n+shift;i++)//有几个移位,在数组b中就补几个0
b[i]=0;
n=n+shift;
if (m>n)
len=m;
else
len=n;
length=len;
while(m>0&&n>0)
{
sum[len-1]=a[m-1]+b[n-1]+flag;
flag=sum[len-1]/10;
sum[len-1]=sum[len-1]%10;
len--;
m--;
n--;
}
while(m>0)
{
sum[len-1]=a[m-1]+flag;
flag=sum[len-1]/10;
sum[len-1]=sum[len-1]%10;
len--;
m--;
}
while(n>0)
{
sum[len-1]=b[n-1]+flag;
flag=sum[len-1]/10;
sum[len-1]=sum[len-1]%10;
len--;
n--;
}
if (flag)
{
for(int i=length-1;i>=0;i--)
sum[i+1]=sum[i];
sum[0]=flag;
flag=1;
}
for(int j=0;j<length+flag;j++)
a[j]=sum[j];
return (length+flag);
}
/*
将字符数组转换为对应的整型数组
比如:ch[]={'1','2','3','4','5'}
转换成
inter[]={1,2,3,4,5}
*/
void charToInteger(char ch[],int inter[])
{
int len=strlen(ch);
for (int i=0;i<len;i++)
inter[i]=ch[i]-'0';
}
3,运行结果