[Vijos P2000]A x B Problem

题目大意:叫你求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。

 

posted @ 2017-07-27 10:44  Mrsrz  阅读(334)  评论(0编辑  收藏  举报