大整数的乘法

模仿笔算乘法代码如下:

网友的作法如下:

#include<stdio.h>
#include<stdlib.h>
#include"string.h"

#define len 20

int main()
{
int i,j,t,n,temp;
char mult1[len];
char mult2[len];
printf("Input two big numbers:\n");
scanf("%s %s",mult1,mult2);
int len1 = strlen(mult1);
int len2 = strlen(mult2);
int *c1 = (int *)malloc(sizeof(int)*len1);
int *c2 = (int *)malloc(sizeof(int)*len2);

for(i=0; i<len1; i++)
c1[i]=(int)mult1[i]-48;//将字符数字转化为数字。1的ASCII为48 
for(i=0; i<len2; i++)
c2[i]=(int)mult2[i]-48;

 int *result = (int *)malloc(sizeof(int)*(len1+len2));//长度len1、len2两数字相乘,结果长度不超过len1=len2.如999*999=998001

n=len1+len2-1; 
for(i=0; i<=n; i++)
result[i]=0; //结果的每一位初始值均为零 
temp=0;
for(i=len2-1; i>-1; i--)
{
	t=c2[i];
	for(j=len1-1; j>-1 ;j--)
	{
		if((temp=result[n]+t*c1[j])>=10)//乘数的一位与被乘数一位相乘有进位 
		{
			result[n]=(temp)%10;//保存乘数的一位与被乘数相乘的结果 
			result[n-1]+=temp/10;//将上次求得的进位保存到result[n-1]
		}
		else//乘数的一位与被乘数一位相乘无进位
		result[n]=temp;
		
		n--;
}
n=n+len1-1;//一轮乘法结束,模仿笔算乘法把下一轮乘法的结果数左移一位 
}

printf("Result: "); 
if(result[0]!=0)//去掉数字前面的零 
printf("%d",result[0]); 
for(i=1;i<=len1+len2-1;i++)
	printf("%d",result[i]); 
printf("\n");
return 0;
}

分治法

算法分析与设计 王晓东 P29

网友代码如下;

 /*设X和Y是两个n位的整数,假定n是2的整数次幂。把每个整数分为两部分,每部分为n/2位,
 则X和Y可重写为X=x1*10n/2+x0和Y=y1*10n/2+y0,X和Y的乘积可以计算为
 X*Y= (x1*10n/2+x0)*( y1*10n/2+y0) = X*Y*10n+(( x1+x0)*( y1+y0)-x1*y1-x0*y0)* 10n/2+ x0*y0
 由此体现了分治递归的思想,将大整数化小,规模也变小。
*/
using namespace std; 
 #include<math.h>
 #include<stdlib.h>
 #include <iostream>
 int n,x,y,rt;//全局变量
 
 void input()
 {
  cout<<"两个乘数的位数是n,请输入n的值(n是2的整数次幂): ";
  cin>>n; 
  cout<<endl<<"请输入两个乘数的值:"<<endl;
  cout<<"x=";
  cin>>x;
  cout<<"y=";
  cin>>y;
 }
 
 int calculate(int a,int b)  //计算数值函数--循环体
 {
  
  int temp1,temp2;
  long s;
  int x1,x0,y1,y0;
  if(n>1)    //可以分治算法的条件
  {
   	  temp1=(int)pow(10,n/2);
	  temp2=(int)pow(10,n);
      x1=a/temp1; //x值的前半部分
      x0=a-x1*temp1; //x值的后半部分
      y1=b/temp1;//y值的前半部分
      y0=b-y1*temp1;//y值的后半部分
      n=n/2;  //经过一次分治后,数的位数减半
      s=calculate(x1,y1)*temp2+(calculate(x1+x0,y1+y0)-calculate(x1,y1)-calculate(x0,y0))*temp1+calculate(x0,y0);
  }
  else
   return a*b; 
  return s;
 }
 
 void print()//输出函数
 {
  cout<<"乘数x="<<x<<"\t"<<"y="<<y<<endl;
  cout<<"结果rt="<<rt<<endl;
 }
 
 int main()//主函数
 {
   char c;
   input();
   rt=calculate(x,y);
   print();
   
   return 0;
 }

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