| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2187 人关注过本帖
标题:[分享]高精度乘法优化
取消只看楼主 加入收藏
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
结帖率:100%
收藏
 问题点数:0 回复次数:0 
[分享]高精度乘法优化
做了一个高精度的题(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
快速回复:[分享]高精度乘法优化
数据加载中...
 
   



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

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