关于作者

计算一个数的价乘!(大数相乘)

上一篇 / 下一篇  2006-11-20 13:05:16 / 精华(1)

查看( 2709 ) / 评论( 37 )

CODE:

<scrīpt language=vbscrīpt>
Function checkn(n)
        if n=0 Or n=1 Then
                checkn = 1
        else
                Dim sNum
                sNum = 1
                For i=0 To n-1
                        document.write sNum & "*" & (n-i) & "<br>"
                        sNum = sNum * (n-i)
                Next
                Checkn = sNum
        End If
End Function

document.write checkn(7)
</scrīpt>
[ 本帖由 ivvn 最后编辑于 2006-1-9 22:18 ]

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的个人空间 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的个人空间 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
逍遥云的Blog 逍遥云 发布于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的个人空间 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的个人空间 ftb 发布于2006-01-09 23:01:23
19楼的速度好快!佩服,比版主那个快啊
155120699的个人空间 155120699 发布于2006-01-09 23:43:57
哎呀,惨~情况不妙..我写的代码最垃圾......闭关修炼,过一段时间,再来应战此贴!!!
我来说两句

(可选)