| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1218 人关注过本帖
标题:[讨论]一道好题
只看楼主 加入收藏
likk
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2005-9-15
收藏
 问题点数:0 回复次数:14 
[讨论]一道好题

通常,在分析一个算法的计算复杂性时,都将加法和乘法运算当作是基本运算来处理,即将执行一次加法或乘法运算所需的计算时间当作一个仅取决于计算机硬件处理速度的常数。

这个假定仅在计算机硬件能对参加运算的整数直接表示和处理时才是合理的。然而,在某些情况下,我们要处理很大的整数,它无法在计算机硬件能直接表示的范围内进行处理。若用浮点数来表示它,则只能近似地表示它的大小,计算结果中的有效数字也受到限制。若要精确地表示大整数并在计算结果中要求精确地得到所有位数上的数字,就必须用软件的方法来实现大整数的算术运算。

请设计一个有效的算法,可以进行两个n位大整数的乘法运算。

大家一起想一想!!

搜索更多相关主题的帖子: 计算机硬件 整数 乘法 加法 数字 
2006-04-07 19:25
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
得分:0 
好像已经有成熟的算法了吧

此人已消失
2006-04-07 19:55
likk
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2005-9-15
收藏
得分:0 
那你试一试!
我发的是讨论!
看看你有没有新的算法
2006-04-07 19:59
likk
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2005-9-15
收藏
得分:0 
当然稍微麻烦一点也不要紧,我就想出了好几种,有一种还不错哩!
2006-04-07 20:00
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
得分:0 
呵呵,偶主要是做计算的:)

此人已消失
2006-04-07 20:06
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
#include<stdio.h>
int *multi1=NULL,*multi2=NULL,*result=NULL;
int c=0,length1,length2;
int i,j,k,m,n,p,q,suffix;
main()
{
printf("Please input the length of multiplicand:");
scanf("%d",&length1);/*输入被乘数的位数*/
multi1=(int *)malloc(length1*sizeof(int));
if(multi1==NULL)
{
printf("No enough memory!");
exit(0);
}
printf("Now enter the multiplicand:");
for(i=0;i<length1;i++)
scanf("%1d",multi1+i);
printf("Then please input the length of multiplier:");
scanf("%d",&length2);/*输入乘数的位数*/
multi2=(int *)malloc(length2*sizeof(int));
if(multi2==NULL)
{
printf("No enough memory!");
exit(0);
}
printf("Now enter the multiplier:");
for(j=0;j<length2;j++)
scanf("%1d",multi2+j);
result=(int *)malloc(length1*length2*sizeof(int));
if(result==NULL)
{
printf("No enough memory!");
exit(0);
}
for(k=0;k<length1*length2;k++)
*(result+k)=0;
for(m=i-1;m>=0;m--)
for(n=j-1;n>=0;n--)
{
c=(*(multi1+m))*(*(multi2+n));
suffix=k-(i-m)-(j-n)+1;
*(result+suffix)+=c%10;
if(*(result+suffix)>=10)
{
*(result+suffix)=*(result+suffix)%10;
*(result+suffix-1)+=1;
}
*(result+suffix-1)+=c/10;
if(*(result+suffix-1)>=10)
{
*(result+suffix-1)=*(result+suffix-1)%10;
*(result+suffix-2)+=1;
}
}
for(p=0;p<=k;p++)
{
if(*(result+p)!=0)
break;
}
for(q=p;q<=k;q++)
printf("%1d",*(result+q));
printf("\n");
free(multi1);
free(multi2);
free(result);
getch();
}

俺是只菜鸟,m*n位相乘结果虽然可以出来,但总带些后缀(比如输入99*99,结果就是980130065),晕死了,麻烦哪个高手帮俺看一下,找一下错误,谢谢!!

对不礼貌的女生收钱......
2006-04-08 09:44
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

陈年老酒拿出来让大家帮我看看,问题没有解决,都已经过一个月了!想了这么久,还是找不出到底是哪错误了?


对不礼貌的女生收钱......
2006-05-05 13:08
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
大整数相乘的完整算法MULT
用pascal语言给出的大整数相乘的完整算法MULT如下:
function MULT(X,Y,n); {X和Y为2个小于2n的整数,返回结果为X和Y的乘积XY}
begin
S:=SIGN(X)*SIGN(Y); {S为X和Y的符号乘积}
X:=ABS(X);
Y:=ABS(Y); {X和Y分别取绝对值}
if n=1 then
if (X=1)and(Y=1) then return(S)
else return(0)
else begin
A:=X的左边n/2位;
B:=X的右边n/2位;
C:=Y的左边n/2位;
D:=Y的右边n/2位;
ml:=MULT(A,C,n/2);
m2:=MULT(A-B,D-C,n/2);
m3:=MULT(B,D,n/2);
S:=S*(m1*2n+(m1+m2+m3)*2n/2+m3);
return(S);
end;
end;

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 13:39
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
其实这些在&lt;数据结构与算法&gt;中都是成熟的,手到擒来的东东。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 13:42
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
楼上的,这个程序还是比较好编的,
只是我怎么也找不到我原来这个程序的错误,
俺没空,得去做事去,
麻烦您帮我看下了,OK?

对不礼貌的女生收钱......
2006-05-05 13:43
快速回复:[讨论]一道好题
数据加载中...
 
   



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

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