| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2187 人关注过本帖
标题:[分享]高精度乘法优化
只看楼主 加入收藏
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
结帖率:100%
收藏
 问题点数:0 回复次数:5 
[分享]高精度乘法优化
做了一个高精度的题(http://www.vijos.cn/Problem_Show.asp?id=1040),一开始用了普通的模拟法,最后一个超大数据超时,因此对程序进行了全面优化,优化后的程序全部 0ms AC

#include<stdio.h>
#include<string.h>
int a[2505],b[2505],x[5010]={0}; /*开大几位,避免越界*/
int main(void)
{
int i,j,k;
int lena,lenb;
char temp[10010];
int t;
scanf("%s",temp);
lena=strlen(temp); /*减少下面的循环中判断计算(最多可以减少10000次计算)*/
if(lena%4)
{
t=4-lena%4;
for(i=t+lena-1;i>=t;i--) temp[i]=temp[i-t];
temp[t+lena]='\0';
lena+=t;
for(i=0;i<t;i++) temp[i]='0';
}
for(i=0,j=1;i<lena;i+=4,j++)
a[j]=(temp[i]-'0')*1000+(temp[i+1]-'0')*100+(temp[i+2]-'0')*10+temp[i+3]-'0';
lena=j;
scanf("%s",temp);
lenb=strlen(temp); /*减少下面的循环中判断计算(最多可以减少10000次计算)*/
if(lenb%4)
{
t=4-lenb%4;
for(i=t+lenb-1;i>=t;i--) temp[i]=temp[i-t];
temp[t+lenb]='\0';
lenb+=t;
for(i=0;i<t;i++) temp[i]='0';
}
for(i=0,j=1;i<lenb;i+=4,j++)
b[j]=(temp[i]-'0')*1000+(temp[i+1]-'0')*100+(temp[i+2]-'0')*10+temp[i+3]-'0';
lenb=j;
for(i=lena-1;i>0;i--)
for(j=lenb-1;j>0;j--)
{
t=i+j; /*临时计算,最多减少7500次计算*/
x[t]+=a[i]*b[j];
x[t-1]+=x[t]/10000; /*使用万进制,计算速度加快4倍*/
x[t]=x[t]%10000; /*使用万进制,计算速度加快4倍*/
}
while(!x[i]) i++;
printf("%d",x[i]);
i++;
for(;i<lena+lenb-1;i++)
if(x[i]>1000) printf("%d",x[i]);
else
if(x[i]>100) printf("0%d",x[i]);
else
if(x[i]>10) printf("00%d",x[i]);
else
printf("000%d",x[i]);
return 0;
}
搜索更多相关主题的帖子: 乘法 高精度 分享 
2007-08-15 11:23
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 
学习中
顶起了~~~~~~~~
2007-08-15 12:21
zjxtx4431
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-8-31
收藏
得分:0 

顶起,高精度算法我总是很讨厌= =

2007-09-01 13:03
华刺
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-5-24
收藏
得分:0 
谢谢分享,学习中。。。

2010-03-31 22:08
华刺
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-5-24
收藏
得分:0 
你有加减和除法的模板吗?想膜拜学习一下!

2010-03-31 22:09
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
貌似乘0就错了
while(!x[i]) i++;
if(i<lena+lenb-1)
printf("%d",x[i]);
else printf("0");
应该这样加个条件吧?
还有用这程序提交这题还是http://acm.hdu.
还是超时
2011-05-20 13:50
快速回复:[分享]高精度乘法优化
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011956 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved