码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1402 A * B Problem Plus

时间:2015-06-02 21:57:07      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

分析:使用64位来保存整数,一个64位保存9位,最后920ms飘过,如果使用ASCII码模拟绝对TLE。貌似这题可以使用FFT(快速傅立叶变换)解决,但是这种方法比较复杂,还没有理解。

#include<iostream>
using namespace std;

__int64 a[10001],b[10001];     //整数a,b,每个存储9位
__int64 ans[40001];        //结果
char sa[50001],sb[50001];  //字符串a,b
int la,lb,l;              //整数a,b及结果的长度
#define MOD 1000000000

void s2int(char* ss,__int64* t,int& k) //字符串转换为64位整形
{
	int len,j;
	__int64 tp=0,p=1,d=1;

	len=strlen(ss);
	k=0;
	for(j=len-1;j>=0;j--)
	{
		tp+=(__int64)(ss[j]-'0')*d;
		if(p>=9)
		{
			t[k++]=tp;
			tp=0;
			p=d=1;
		}
		else
		{
			p++;
			d*=10;
		}
	}
	t[k++]=tp;
}

void show()
{
	int i;

	printf("%I64d",ans[l-1]);
	for(i=l-2;i>=0;i--)
		printf("%09I64d",ans[i]);
	printf("\n");
}

void solve()
{
	int i,j;
	__int64 jf;

	memset(a,0,sizeof(sa));
	memset(b,0,sizeof(sb));
	s2int(sa,a,la);   //转换为整形
	s2int(sb,b,lb);

	memset(ans,0,(la+lb+2)*sizeof(__int64));
	for(i=0;i<la;i++)
	{
		jf=0;
		l=i;
		for(j=0;j<lb;j++)
		{
			jf+=a[i]*b[j]+ans[l];
			ans[l++]=jf%MOD;
			jf/=MOD;
		}
		while(jf)
		{
			jf+=ans[l];
			ans[l++]=jf%MOD;
			jf/=MOD;
		}
	}
	show();
}

int main()      
{
	while(scanf("%s%s",sa,sb)==2)
	{
		solve();
	}
    return 0;      
}


HDU ACM 1402 A * B Problem Plus

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46335145

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!