计算一个数的价乘!(大数相乘)
上一篇 / 下一篇 2006-11-20 13:05:16 / 精华(1)
查看( 2708 ) /
评论( 37 )
TAG:
-
girl发布于2006-01-08 11:35:57
-
CODE:
<script type="text/javascript">
function abc(n)
{
if(n<=0){return 1}
return n*abc(n-1);
}
alert(abc(7));
</script>
-
aasvvv发布于2006-01-08 12:54:21
-
计算出来1*2*3*4*6*……*70*71的结果了,数字如下
1*2*3*4*6*……*70*71
=22628415745373310152132164676726316036276061412860377321530701718729523099750094602240000000000000000000
-
155120699
发布于2006-01-08 14:58:55
-
CODE:
<script type="text/javascript">
function num(n)
{
var s=1;str="1"
for(var i=1;i<=n;i++)
{
str+="*"+i
s=s*i
}
return str.replace(/1\*/,"")+"="+s
}
alert(num(7))
</script>
-
月影
发布于2006-01-08 17:25:59
-
大数乘法么?好玩...
我们来比比看谁算出的阶乘最大...^^
-
ivvn
发布于2006-01-08 17:43:12
-
QUOTE:
引用内容由 月影 发表于 2006-1-8 05:25 PM
用字符串模拟可以无限大
大数乘法么?好玩...
我们来比比看谁算出的阶乘最大...^^
像这样自然最大不能超过170
-
月影
发布于2006-01-08 18:29:59
-
算出来的71的阶乘和楼上的不一样...=.=
CODE:
<script>
var n = null;
function Factorial(n)
{
if(n <= 1){return "1"}
else
{
return BigMulti(Factorial(n - 1), n.toString());
}
}
function BigMulti(a, b) //大数乘法
{
var ret = "";
var offset = "";
for(var i = 0; i < b.length; i++)
{
var y = b.charAt(b.length - i - 1);
var r = BigMultiN(a, (y - 0)) + offset;
ret = BigAdd(ret, r);
offset += "0";
}
return ret;
}
function BigAdd(a, b) //大数加法
{
var ret = "";
var tip = 0;
for (var i = 0; i < a.length || i < b.length; i++)
{
var x = 0;
var y = 0;
if(i < a.length)
x = a.charAt(a.length - i - 1);
if(i < b.length)
y = b.charAt(b.length - i - 1);
var c = (x - 0) + (y - 0) + tip;
if(c > 9)
{
tip = 1;
c = c%10;
}
else
tip = 0;
ret = c + ret;
}
if(tip > 0) ret = tip + ret;
return ret;
}
function BigMultiN(a, n) //一位大数乘法
{
var ret = "";
var tip = 0;
for (var i = 0; i < a.length; i++)
{
var x = a.charAt(a.length - i - 1);
var c = (x - 0) * n + (tip - 0);
tip = Math.floor((c/10));
c = c%10;
ret = c + ret;
}
if((tip - 0) > 0) ret = tip + ret;
return ret;
}
alert("7!="+Factorial(7));
alert("37!="+Factorial(37));
alert("71!="+Factorial(71));
alert("100!="+Factorial(100));
alert("150!="+Factorial(150));
</script>
-
月影
发布于2006-01-08 18:32:10
-
不过我想我的是对的...
因为用2楼的代码算出来的是...8.5047...e+101
-
逍遥云
发布于2006-01-08 19:04:30
-
月儿讲讲大数乘法,我第一次听说
-
月影
发布于2006-01-08 20:11:54
-
大数乘法是一个在很多场合下都有可能用到的重要算法
顾名思义,其功能是求一对非常大的整数相乘的精确结果
而这一对整数往往远大于机器硬件和编程语言所能表示的整数范围
以前的ACM竞赛中就常常出现要求上千位整数相乘结果的问题
大数算法的本质相当好理解,也就是类似我们笔算那样的“逐位相乘”。(也就是我上面实现的那种算法)
上面这种解释似乎看起来非常简单,不过,“逐位相乘”虽然理论上可以得到几乎“无限大”(当然不能超出存储空间限制)的结果。但是,注意到实际上用逐位相乘的算法计算一个m位数和n位数的乘积需要做m*n次一位数乘法和m*n次一位加法,所以这个算法的时间复杂度为O(n^2)。这样如果数目很大的话,算法执行起来就需要很长的时间。所以“用字符串模拟可以无限大”这种说法(6楼注意咯^^),只有“理论上”的正确性。
那么有没有办法提高大数乘法的效率呢?答案是有的。这也就是许多研究“大数”问题的科学家们努力的方向——寻找O(n*logn)或者更优的算法。
[ 本帖由 月影 最后编辑于 2006-1-8 20:13 ]
-
windowspp发布于2006-01-08 20:29:05
-
算的我机器差点死机..
电脑破.....汗.......
-
月影
发布于2006-01-08 20:32:35
-
呵呵...我这台PIV 512M的机子算150!大概要1秒钟...已经很慢了... ^^
-
dron
发布于2006-01-08 21:04:41
-
呵呵,月影太精彩了,加分加精!
[ 本帖由 dron 最后编辑于 2006-1-8 21:05 ]
-
编程浪子
发布于2006-01-08 21:17:18
-
QUOTE:
引用内容由 月影 发表于 2006-1-8 20:11
不知道具体哪些场合用到,说来听听,反正我就没用到过:ogle:
大数乘法是一个在很多场合下都有可能用到的重要算法
-
月影
发布于2006-01-08 21:26:39
-
QUOTE:
引用内容由 编程浪子 发表于 2006-1-8 09:17 PM
加密、随机序列生成、摘要生成算法等等...
不知道具体哪些场合用到,说来听听,反正我就没用到过:ogle:
还有ACM的某些题可能会用到...
有兴趣的话可以去acm.zju.edu.cn看看...
-
ivvn
发布于2006-01-08 23:31:17
-
月影这个大数乘法搞得不错!
-
aasvvv发布于2006-01-09 02:24:56
-
可能是我写的乘法出错了,我上次写了加,减,乘的,但除法头痛,特别是碰到可能除不尽的数,保留几位算准确就难判断了!
-
Jimmyboy发布于2006-01-09 20:13:36
-
我也来。
CODE:
<script>这个只能得到二进制结果,速度也比斑竹的慢。惭愧!:(
function BinAdd(opr1,opr2) {
if(opr1.indexOf('1')==-1) return opr2;
if(opr2.indexOf('1')==-1) return opr1;
var cf='0';
var ret='';
var len1=opr1.length;
var len2=opr2.length;
var maxlen=len1;
if(len2>maxlen) maxlen=len2;
while(len1<maxlen) {opr1='0'+opr1;len1++;}
while(len2<maxlen) {opr2='0'+opr2;len2++;}
for(var i=maxlen-1;i>=0;i--) {
if(opr1.charAt(i)=='0' && opr2.charAt(i)=='0')
{ret=cf+ret;cf='0';}
else if(opr1.charAt(i)=='1' && opr2.charAt(i)=='1')
{ret=cf+ret;cf='1'}
else if(cf=='1') {ret='0'+ret;}
else ret='1'+ret;
}
if(cf=='1') ret=cf+ret;
return(ret);
}
function Factorial(n) {
if(n<2) return('1');
var szero,temp;
var ret='1';
for(var i=2;i<=n;i++){
szero='';
temp=ret;
ret='0';
var j=i;
while(j>0) {
if(j%2) {
ret=BinAdd(ret,temp+szero);
j--;
}
szero+='0';
j/=2;
}
}
return(ret);
}
alert('150!='+Factorial(150));
</script>
[ 本帖由 Jimmyboy 最后编辑于 2006-1-9 20:18 ]
-
七月流火发布于2006-01-09 22:08:52
-
俺也来一个
CODE:
<script>
function factorial(n)
{
var a = [1];
for (var i = 1; i <= n; ++i)
{
for (var j = 0, c = 0; j < a.length || c != 0; ++j)
{
var m = (j < a.length) ? (i * a[j] + c) : c;
a[j] = m % 10;
c = (m - a[j]) / 10;
}
}
return a.reverse().join("");
}
alert("7!=" + factorial(7) + "\n\n37!=" + factorial(37) + "\n\n71!=" + factorial(71) + "\n\n100!=" + factorial(100) + "\n\n150!=" + factorial(150));
</script>
-
ftb
发布于2006-01-09 23:01:23
-
19楼的速度好快!佩服,比版主那个快啊
-
155120699
发布于2006-01-09 23:43:57
-
哎呀,惨~情况不妙..我写的代码最垃圾......闭关修炼,过一段时间,再来应战此贴!!!
