大整数乘法运算代码

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,运行结果

《大整数乘法运算代码》

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/chenxieyy/article/details/47982243
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞