大整数乘法运算代码

来源:互联网 发布:淘喵淘宝互刷流量软件 编辑:程序博客网 时间:2024/06/05 01:51

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中就补几个0b[i]=0;n=n+shift;    if (m>n)    len=m;elselen=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,运行结果

0 0
原创粉丝点击