<模板> Hdu 1402 A * B Problem Plus 大数乘法

本文介绍了一种处理大整数相乘问题的算法实现,针对长度不超过50,000位的大整数,通过特殊的输入处理和乘法运算策略来避免普通整数类型无法直接处理的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A * B Problem Plus

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12315    Accepted Submission(s): 2157


Problem Description
Calculate A * B.
 

Input
Each line will contain two integers A and B. Process to end of file.

Note: the length of each integer will not exceed 50000.
 

Output
For each case, output A * B in one line.
 

Sample Input
1 2 1000 2
 

Sample Output
2 2000
 

虽然还是没有AC。超时了。未解之谜,仔细再看看。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <vector>
#define LL __int64
#define M 10000000000
using namespace std;
LL a[5100],b[5100],c[110000];
char s1[500010],s2[500010];
void MUL()
{
	int t,i,j;
	memset(c,0,sizeof(c));
	for (i=a[0];i>0;i--)
	{
		t=a[0]-i+1;
		for (j=b[0];j>0;j--)
		{
			c[t+b[0]-j+1]+=a[i]*b[j] / M;
			c[t+b[0]-j]+=a[i]*b[j]%M;
		}
		if (c[t+1])
			c[0]=t+1;
		else c[0]=t;
	}
}
int main()
{
	while (gets(s1))
	{
		gets(s2);
		strrev(s1);
		strrev(s2);
		int l1=strlen(s1)-1;
		int l2=strlen(s2)-1;
		memset(a,0,sizeof(0));
		memset(b,0,sizeof(0));
		while(l1>=0)
		{
			LL k=0,s=0;
			while (k<10 && l1>=0)
			{
				s=s*10+s1[l1]-'0';
				k++;
				l1--;
			}
			a[0]++;
			a[a[0]]=s;
		}
		while(l2>=0)
		{
			int k=0,s=0;
			while (k<10 && l2>=0)
			{
				s=s*10+s2[l2]-'0';
				k++;
				l2--;
			}
			b[0]++;
			b[b[0]]=s;
		}
		MUL();
		printf("%I64d",c[c[0]]);
		for (int i=c[0]-1;i>1;i--)
			printf("%010I64d",c[i]);
		printf("%I64d\n",c[1]);
		//cout<<endl;
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值