[Vijos P2000]A x B Problem

本文详细介绍了一种解决大数乘法问题的高精度算法实现,通过C++代码示例展示了如何将大数分解并进行高效乘法运算,适用于处理超出标准数据类型范围的数学计算。

题目大意:叫你求A × B。

解题思路:高精度。你可千万别小看这道题,这是2017年7月27日的信息。

 

不过也不要怕,根据twd2的题解里写的,用普通的高精度加上一些小小的修改是可以过的。

那么直接上代码吧。

C++ Code:

 

#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
char s[5005];
long long num1[701],num2[701],num3[1700];
int main(){
	int n;
	scanf("%d",&n);
	while(n--){
		memset(num1,0,sizeof(num1));
		memset(num2,0,sizeof(num2));
		int len=0;
		char c=getchar();
		while(!isdigit(c))c=getchar();
		while(isdigit(c)){
			s[++len]=c;
			c=getchar();
		}
		int w=1,l1=1,l2=1;
		for(int i=len;i;i--){
			if(w==100000000){
				w=1;l1++;
			}
			num1[l1]+=w*(s[i]-'0');
			w*=10;
		}
		len=0;
		while(!isdigit(c))c=getchar();
		while(isdigit(c)){
			s[++len]=c;
			c=getchar();
		}
		w=1;
		for(int i=len;i;i--){
			if(w==100000000){
				w=1;l2++;
			}
			num2[l2]+=w*(s[i]-'0');
			w*=10;
		}
		memset(num3,0,sizeof(num3));
		int l3=l1+l2+4;
		for(int i=1;i<=l1;i++)
		for(int j=1;j<=l2;j++)num3[i+j-1]+=num1[i]*num2[j];
		for(int i=1;i<=l1+l2+3;i++)
		if(num3[i]>=100000000){
			num3[i+1]+=num3[i]/100000000;
			num3[i]%=100000000;
		}
		while(num3[l3]==0&&l3>1)l3--;
		printf("%lld",num3[l3]);
		for(int i=l3-1;i;i--)printf("%08lld",num3[i]);
		puts("");
	}
	return 0;
}

 

这是时间使用情况:

我觉得时间用的并不是很多,就把乘法和除法、取模放在一块,结果居然被我卡过去了!!

C++ Code:

 

#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
char s[5005];
long long num1[701],num2[701],num3[1700];
int main(){
	int n;
	scanf("%d",&n);
	while(n--){
		memset(num1,0,sizeof(num1));
		memset(num2,0,sizeof(num2));
		int len=0;
		char c=getchar();
		while(!isdigit(c))c=getchar();
		while(isdigit(c)){
			s[++len]=c;
			c=getchar();
		}
		int w=1,l1=1,l2=1;
		for(int i=len;i;i--){
			if(w==100000000){
				w=1;l1++;
			}
			num1[l1]+=w*(s[i]-'0');
			w*=10;
		}
		len=0;
		while(!isdigit(c))c=getchar();
		while(isdigit(c)){
			s[++len]=c;
			c=getchar();
		}
		w=1;
		for(int i=len;i;i--){
			if(w==100000000){
				w=1;l2++;
			}
			num2[l2]+=w*(s[i]-'0');
			w*=10;
		}
		memset(num3,0,sizeof(num3));
		int l3=l1+l2+4;
		for(int i=1;i<=l1;i++)
		for(int j=1;j<=l2;j++){
			num3[i+j-1]+=num1[i]*num2[j];
			num3[i+j]+=num3[i+j-1]/100000000;
			num3[i+j-1]%=100000000;
		}
		while(num3[l3]==0&&l3>1)l3--;
		printf("%lld",num3[l3]);
		for(int i=l3-1;i;i--)printf("%08lld",num3[i]);
		puts("");
	}
	return 0;
}

 

这是时间使用情况,可以发现,除了第一个点,其他都是900+ms的,有一个甚至达到了996ms!!这说明我RP好23333333。

 

转载于:https://www.cnblogs.com/Mrsrz/p/7243551.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值