大整数乘法题解

描述

求两个不超过200位的非负整数的积。

输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。 输出

一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

解:

由题,输入200位的非负整数是无法用整形储存的,因此只能用字符串输入,再将其转换为数组形式运算并输出。

先定义两个字符串m、n,通过字符串输入,再定义两个整形数组a、b,通过循环将mn倒置并减去‘0’化为整数,放入ab中。然后定义c数组来存放计算结果,并使每一位初始值为0。接下来就是两数相乘的过程。先写出两重循环,模拟竖式,循环变量分别表示ab所计算到的位置,再专门定义s     表示结果存放在c的那一位。由于进位的问题,一定要在计算c[s]时加上其本身,并只保留个位,因此c[s]=(c[s]+a[i]*b[j])%10,c的后一位则变为其本身加上c[s]的十位(由于这是乘法,因此每一位可能循环计算很多次,必须注意加上其本身)。还需注意,当a[i]乘完整个b数组后,s又得退回,但根据竖式,每乘完一次b,s退回的值都-1。最后,由于方便,之前的计算是让c从0开始计数的,因此需找到最后一位字符,并倒着输出。


参考代码:

#include<math.h>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int main()
{
	char m[200],n[200];
	int a[200],b[200];
	scanf("%s %s",m,n);
	if(m[0]=='0'||n[0]=='0')
	{
		printf("0");
		return 0;
	}
	for(int i=0;i<strlen(m);i++)
	{
		a[i]=m[strlen(m)-1-i]-'0';
	}
	for(int i=0;i<strlen(n);i++)
	{
		b[i]=n[strlen(n)-1-i]-'0';
	}
	/*for(int i=0;i<strlen(n);i++)
	{
		printf("%d",b[i]);
	}
	printf("\n");*/
	int c[40000];
	for(int i=0;i<40000;i++)
	{
		c[i]=0;
	}
	int s=0;
	int t=0;
	for(int i=0;i<strlen(m);i++)
	{
		for(int j=0;j<strlen(n);j++)
		{
			c[s]=c[s]+a[i]*b[j];
			c[s+1]=c[s+1]+c[s]/10;
			c[s]=c[s]%10;
			s++;
		}
		t++;
		s=t;
	}
	s=strlen(m)+strlen(n);
	while(c[s]==0)
	{
		s--;
	}
	for(int i=s;i>=0;i--)
	{
		printf("%d",c[i]);
	}
}
    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/sonovain/article/details/50583227
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞