首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求n!+(n+1)!+..........+2!+1! 算法
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • goldbranch2012
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-05-22 09:29:43 楼主
    求n!+(n+1)!+..........+2!+1! 算法
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hcyang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 09:35:101楼 得分:0
    ..........是什么?
    还是这样:  n!+(n-1)!+..........+2!+1!  ?????
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • langhua0001
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 09:37:372楼 得分:0
    引用楼主 goldbranch2012 的帖子:
    求n!+(n+1)!+..........+2!+1! 算法


    楼主的思维为什么是反的呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xushengcn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 09:38:113楼 得分:0
    这种级数有现成公式的,不需要编程实现。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

    发表于:2008-05-22 09:39:334楼 得分:0
    C/C++ code
    #include <iostream> using namespace std; int main(int argc, char* argv[]) { int n = 5; int i, result = 0; for (i = n ; i >= 1; --i) result = (result + 1)*i; cout << result << endl; return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xushengcn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 09:43:005楼 得分:0
    C/C++ code
    #include <iostream> using namespace std; int main() { int sum = 0; for (int i = 1; i <= 10; i++) { int mul = 1; for (int j = i; j >= 1; j--) { mul *= j; } sum += mul; } cout << sum << endl; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sungoco2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 09:48:036楼 得分:0
    还是翻翻数学分析吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • handsomezwm
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 09:50:597楼 得分:0
    C++ code:

    #include"iostream"
    using namespace std;

    #define  N 10

    long fac(int n)
    {
      if(n==1)  return 1;
      else      return n*fac(n-1);
    }

    void main()
    {
      long int sum=0;
      for(int i=1;i <=N;i++)
        sum+=fac(i);
       
      cout < <sum < <endl;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • laolaoliu2002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 09:58:318楼 得分:0
    这个学问大了,首先是大数的表示,然后是大数运算,其次还有效率问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • anglecloudy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 10:02:109楼 得分:0
    应该是这样吧:n!+(n-1)!+..........+2!+1! 
    呵呵,楼上基本正解,这种题目用递归实现。本人修改了一下:
    C/C++ code
    #include <iostream> using namespace std; long fac(int n) { if(n==1) return 1; else return n*fac(n-1); } void main() { long int sum=0; int num; cout<<"请输入你要计算的n的值:"; cin>>num; for(int i=1;i <=num;i++) sum+=fac(i); cout <<sum <<endl; }



    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • healer_kx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 10:34:0610楼 得分:0
    UP飞雪,其他的代码真是简洁又天真啊。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • laolaoliu2002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 10:38:3611楼 得分:0
    上面的所有代码都是扯淡输入n=1000试一下,都报错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • laolaoliu2002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 10:40:1712楼 得分:0
    知道100!有多少位数吗?157位
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • healer_kx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 10:51:2613楼 得分:0
    引用 11 楼 laolaoliu2002 的回复:
    上面的所有代码都是扯淡输入n=1000试一下,都报错。


    用Ruby啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 10:57:4314楼 得分:0
    C/C++ code
    #include <iostream> #include <stdlib.h> using namespace std; void main() { int res=0; int n=4; int mid=1; for(int i=1;i<=n;i++) { res+=(mid=mid*i); } cout<<res<<endl; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 11:01:0115楼 得分:0
    把res和mid改成double 的应该能计算大一些的数,要再大的话,应该用大数了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lionc650
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 11:01:5816楼 得分:0
    飞雪的算法还是第一见呢.....看来还是数学学的不精啊..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • laolaoliu2002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 11:05:5217楼 得分:0
    引用 13 楼 healer_kx 的回复:
    用Ruby啊

    那还不如用erlang呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmlovelx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 11:33:0918楼 得分:0
    up  4楼 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zsxcn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:10:1219楼 得分:0
    飞雪的算法太强了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:17:1020楼 得分:0
    引用 11 楼 laolaoliu2002 的回复:
    上面的所有代码都是扯淡输入n=1000试一下,都报错。

    支持这个!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • anglecloudy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:22:2721楼 得分:0
    晕,楼上的太毒了。
    改了一下,20000位以内的数都没问题。
    用字符数组存放大数。
    C/C++ code
    #include <stdio.h> #include <string.h> #define MAX 20000 int fac(int n,char value[],int m)//计算n的阶层 { int carry = 0; int r; int valueLen = 1, index = 0;//valueLen为结果的长度 int i, j; //初始化value数组 value[0] = '1'; for (i = 1; i < m; i++) { value[i] = '0'; } for(i = 1; i <= n; i++) { index = 0; for(j = 0; j < valueLen; j++) { r = (value[index] - '0')*i + carry; value[index] = r % 10 + '0'; carry = r / 10; //进位 index++; if(carry > 0 && index == valueLen)//最高位有进位才能将长度加1 { valueLen++; } } } return valueLen; } void add(char *num1, char *num2)//大数相加 { int iLen1; int iLen2; int iTemp = 0; int i; iLen1 = strlen(num1); iLen2 = strlen(num2); memmove(num1+(100-iLen1), num1, iLen1); memset(num1, '0', 100-iLen1); memmove(num2+(100-iLen2), num2, iLen2); memset(num2, '0', 100-iLen2); for(i=99;i>=0; i--) { iTemp = (num1[i] - '0' + num2[i] - '0') + iTemp; num1[i] = (iTemp%10) + '0'; iTemp = iTemp/10; } for(i=0; i<100; i++) { if(num1[i] != '0')break; } memmove(num1, num1+i, 100 - i); num1[100 - i] = '\0'; } int test(char *num1) { int iLen; int i; iLen = strlen(num1) -1; for(i=0; i<=iLen; i++) { if(num1[i] != num1[iLen-i]) { return 1; } } return 0; } int main() { char value[MAX]; char sum[MAX]; sum[0] = '1'; for (int ti = 1; ti < MAX; ti++) { sum[ti] = '0'; } int n=0; printf("Please input a factorial numble:"); scanf("%d",&n); int valueLen=fac(n,value,MAX); for(int i =valueLen-1; i >= 0; i--) { printf("%c",value[i]); } printf("\n"); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fallening
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:27:3622楼 得分:0
    引用 21 楼 anglecloudy 的回复:
    晕,楼上的太毒了。
    改了一下,20000位以内的数都没问题。
    用字符数组存放大数。
    C/C++ code#include <stdio.h>#include <string.h>#defineMAX  20000intfac(intn,charvalue[],intm)//计算n的阶层{intcarry=0;intr;intvalueLen=1, index=0;//valueLen为结果的长度inti, j;//初始化value数组value[0]='1';for(i=1; i <m; i++)
        {
          value[i]='0';
        }for(i=1; i <=n; i++)
        {
          index=0;for(j=0; j <valueLen; j…

    楼上的,大家都说飞雪的那个算法,主要是指他的算法中
    C/C++ code
    result = (result + 1)*i;

    尽可能地提取公因子,减少乘法运算的次数以提高效率
    不要再递归了,看得头晕
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • grellen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:37:3823楼 得分:0
    引用 4 楼 baihacker 的回复:
    C/C++ code#include <iostream>usingnamespacestd;intmain(intargc,char*argv[])
    {intn=5;inti, result=0;for(i=n ; i>=1;--i)
            result=(result+1)*i;
        cout < <result < <endl;return0;
    }

    强啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MagiSu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:00:4724楼 得分:0
    直接用MatLab计算吧,用C++多罗嗦啊。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hpj2000
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:02:1525楼 得分:0
    晕了,不知道到底有没有正确的代码 - -!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:12:2926楼 得分:0
    现在大学生写出来的算法起码也要飞雪那样。。。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:14:3327楼 得分:0
    记得进公司的时候。
    这道题
    就2个大专生做出来
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WuBill
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:15:1428楼 得分:0
    引用 4 楼 baihacker 的回复:
    C/C++ code#include  <iostream>
    using namespace std;


    int main(int argc, char* argv[])
    {
        int n = 5;
        int i, result = 0;
        for (i = n ; i >= 1; --i)
            result = (result + 1)*i;
        cout < < result < < endl;
        return 0;
    }


    正解
    思想和秦九韶算法求多项式差不多,估计这是效率最高的算法了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WuBill
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:23:1729楼 得分:0
    以前上线性代数和数值分析时,老师都提过这些算法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnmmbd
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:37:4230楼 得分:0
    哦……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Vitin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 14:46:4731楼 得分:0
    飞雪的算法是正确的。

    循环不变量为:当i=k完成后,result满足如下等式:
    result*(k-1)! = n! + (n-1)! + ... + k!
    所以整个循环结束后,k下降到1,0!为1,result就是所需结果。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lyle3
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 15:05:3232楼 得分:0
    学习了,mark 下~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lc19890326
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 15:08:1733楼 得分:0
    赞飞雪的算法

    不过大数问题也是需要考虑的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lfhlyx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 15:25:3934楼 得分:0
    数学分析里不是有么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiqing_gao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 15:33:0735楼 得分:0
    开眼戒了~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zdy1986816
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 15:52:3536楼 得分:0
    using namespace std;
    int main()
    {
    int n;
    cout < <"请输入要计算的n值:";
    cin>>n;
    int k = 1;
    int m = 0;
    for(int i = 1; i <= n; i++)
    {
    for(int j =1; j <= i; j++)
    k = k * j;
    m = m + k;
    k = 1;
    }
    cout < <"最后的结果为:" < <m < <endl;
    return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zdy1986816
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 15:53:5237楼 得分:0
    #include <iostream>......没写上去~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • birchlin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 16:11:0638楼 得分:0
    飞雪强!

    楼主要的是算法! 不是大数的表示法!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • birchlin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 16:13:0739楼 得分:0
    如果n=100^10000000^10000000^1000000

    估计世界上目前没人能编程算出来
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WANGZHANLING
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 16:24:3940楼 得分:0
    很明了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZhangStanford
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 16:26:1541楼 得分:0
    飞雪的方法太妙了!
    佩服!
    还是数学学的不好啊……
    如果n=5的话,拆成这样:
    ((((((0+1)*5+1)*4+1)*3+1)*2+1)+1)*1
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • athrunzalatt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 16:28:3942楼 得分:0
    #include <iostream>
    using namespace std;
    jiecheng(int j)
    {
    int i,a;
    a=1;
    for(i=1;i <=j;i++)
    {
    a=a*i;
    }
    return a;
    }

    main()
    {
    int a,b,c,e;
    b=0;
    cin >>c;
    for(e=1;e <=c;e++)
    {
    b=b+jiecheng(e);
    }
    cout < <b < <endl;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZhangStanford
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 16:34:5943楼 得分:0
    14楼的算法也不错~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • x198506
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 16:38:3244楼 得分:0
    强!~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gxj760998
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 16:45:4145楼 得分:0
    这道题在学校的时候见过!因为加法比乘法快很多。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • csmathboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 20:46:0346楼 得分:0
    #include <iostream>
    using namespace std;
    int main()
    {
    int n,i,s;
    while(1)
    {
    cin>>n;
    if(n==0) break;
    for(s=1,i=n;i>1;i--)
    {
    s=s*i+1;
    }
    cout < <s < <endl;
    }
    return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • EonianGlutton
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 21:45:1847楼 得分:0
    学习了。呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bigeon
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 21:50:1748楼 得分:0
    for(i=1;i <=n;i++)
    {
        result =i*( result +=i);
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bigeon
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 21:51:4949楼 得分:0
    不知道这个算法有问题不?
    for(i=1;i <=n;i++)
    {
        result =i*( result +=i);
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cinanynames
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 22:06:4450楼 得分:0
    引用楼主 goldbranch2012 的帖子:
    求n!+(n+1)!+..........+2!+1! 算法

    ???看上去相当诡异。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xdicac
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 22:13:1551楼 得分:0
    4楼算法+21楼的大数乘法算法就应该能解决了吧……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cyblueboy83
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 22:18:3552楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • GoAssemblyNow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 22:34:0953楼 得分:0
    #include  <iostream>
    using namespace std;


    int main(int argc, char* argv[])
    {
        int n = 5;
        int i, result = 0;
        for (i = n ; i >= 1; --i)//    倒过来写行吗?
            result = (result + 1)*i;
        cout < < result < < endl;
        return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nmglzlong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 22:44:0554楼 得分:0
    收藏了mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • GoAssemblyNow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 22:46:0755楼 得分:0
    引用 41 楼 ZhangStanford 的回复:
    飞雪的方法太妙了!
    佩服!
    还是数学学的不好啊……
    如果n=5的话,拆成这样:
    ((((((0+1)*5+1)*4+1)*3+1)*2+1)+1)*1


    绝妙!开眼了!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • GoAssemblyNow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 22:51:4656楼 得分:0
    n=170,double result=7.30036e+306.时间不到一秒,算法绝对高效啊,飞雪真是高人.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • alex9981
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 22:56:2357楼 得分:0
    好 支持该算法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • eric_0206
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 23:09:4958楼 得分:0
    #include <stdio.h>
    void main()
    {
    int n,result=0,temp=1;
    scanf("%d",&n);
    for(int i=1;i <=n;i++)
    {
    temp*=i;
    result+=temp;
    }
    printf("%d\n",result);
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hnbczmh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 23:19:1659楼 得分:0
    C/C++ code
    for (i = n ; i >= 1; --i) result=(result + 1)*i;

    C/C++ code
    for(int i=1;i<=n;i++) res+=(mid=mid*i);

    相比两个算法,独行的算法更加好理解一些,在时间复杂度和空间复杂度上的差别也可以忽略不计。
    都挺强的!没看到这两个算法之前,我是不会想到还可以这样做的,嘿....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gl615
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 23:24:2760楼 得分:0
                真的很是高效啊。。
      太奇妙了。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hagangqiou
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 23:40:3261楼 得分:0
    按+分隔,其实每个数比后面的数大而且是后面数的倍数。
    按照这个思路来编效率会比较高,飞雪就是这种思路。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zgmary
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 00:20:1062楼 得分:0
    学习了~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toonycheng
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 00:22:0963楼 得分:0
    支持飞雪!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nicky_zs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 01:50:2264楼 得分:0
    int s = 1;
    for (int i = n; i > 1; --i) {
    s = s * i + 1;
    }
    return s;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ONLYBLUEMOON
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 01:55:0165楼 得分:0
    解释一下飞雪的:
    1+1*2+1*2*3+1*2*3*4
    1(1+2+2*3+234)
    1(1+2(1+3+34))
    1(1+2(1+3(1+4))
    I=n;i>0;i—


    #include  <iostream>
    using namespace std;


    int main(int argc, char* argv[])
    {
        int n = 6;
        int i, result = 1;
        for (i = n ; i >= 1; --i)
            result = 1+i*result;
        cout < < result-1 < < endl;
        return 0;
    }
    #include  <iostream>
    using namespace std;


    int main(int argc, char* argv[])
    {
        int n = 6;
        int i, result = 0;
        for (i = n ; i >= 1; --i)
            result = (result + 1)*i;
        cout < < result < < endl;
        return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin29276
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 09:07:1766楼 得分:0
    很好很强大
    mark...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kingsun555
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 09:12:3067楼 得分:0
    可以利用前一个加数的值来得到后一个,减少计算。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BIGBIRDINWOODS
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 11:05:1768楼 得分:0
    嗯,眼界开了,学习,也考虑下其他的算法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhoufuguo8802
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 11:38:3669楼 得分:0
    #include <iostream>
    应该要用递归,程序不要求效率和重用性。
    using namespace std;
    long fac(int n)
    {
      if(n==1)  return 1;
      else      return n*fac(n-1);
    }

    void main()
    {
      long int sum=0;
      int num;
      cout < <"请输入你要计算的n的值:";
      cin>>num;
      for(int i=1;i <=num;i++)
        sum+=fac(i);
      cout < <sum < <endl;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xushengcn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 11:47:2870楼 得分:0
    如果是n!+(n-2)!+(n-4)!+...+0!呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • birchlin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 11:51:1571楼 得分:0
    以执行速度为标准,大家说哪个算法更好?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • PcrazyC
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 11:53:4872楼 得分:0
    引用 10 楼 healer_kx 的回复:
    UP飞雪,其他的代码真是简洁又天真啊。


    现在的程序员啊....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ymntomyimi8855
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 12:19:3673楼 得分:0
    楼主的问题是错的,根本就没有这种情况,如果要写就写全了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Paradin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 12:22:4374楼 得分:0
    C/C++ code
    //calculate 1! + 2! + ... + n! where n is a positive integer #include <iostream> using namespace std; const long maxlen = 100000; int main() { cout << "Input n: "; int n = 0; cin >> n; cout << "1! + 2! + ... + " << n << "! = "; int result[maxlen] = {0}, len_r = 0; int temp[maxlen] = {0}, len_t = 0; temp[0] = 1; len_t = 1; for (int x = 1; x <= n; x++) { temp[0] = temp[0] * x; for (int j = 1; j < len_t; j++) { temp[j] = temp[j] * x + temp[j-1] / 10; temp[j-1] = temp[j-1] % 10; } while (temp[len_t-1] > 10) { temp[len_t] = temp[len_t-1] / 10; temp[len_t-1] = temp[len_t-1] % 10; len_t++; } for (int i = 0; i < len_t; i++) { result[i] = result[i] + temp[i]; result[i+1] = result[i+1] + result[i] / 10; result[i] = result[i] % 10; } len_r = len_t; while (result[len_r] > 0) { result[len_r+1] = result[len_r] / 10; result[len_r] = result[len_r] % 10; len_r++; } } int k = len_r - 1; while (result[k] == 0 && k > 0) k--; for (; k >= 0; k--) cout << result[k]; cout << endl << endl << "Total Digits: " << len_r << endl; return 0; }



    算得 1!+2!+...+100!=
    94269001683709979260859834124473539872070722613982
    67244293835930562467822347950602340029409359913646
    69866091243474326476228268700382205564423365289204
    20940313
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tianloveyou
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 12:41:1075楼 得分:0
    引用 7 楼 handsomezwm 的回复:
    C++ code:

    #include"iostream"
    using namespace std;

    #define  N 10

    long fac(int n)
    {
      if(n==1)  return 1;
      else      return n*fac(n-1);
    }

    void main()
    {
      long int sum=0;
      for(int i=1;i <=N;i++)
        sum+=fac(i);
       
      cout < <sum < <endl;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tbocd
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 12:48:2176楼 得分:0
    引用 4 楼 baihacker 的回复:
    C/C++ code#include  <iostream>
    using namespace std;


    int main(int argc, char* argv[])
    {
        int n = 5;
        int i, result = 0;
        for (i = n ; i >= 1; --i)
            result = (result + 1)*i;
        cout < < result < < endl;
        return 0;
    }



    另一种理解:
    #include  <iostream>
    using namespace std;


    int main(int argc, char* argv[])
    {
    int n = 5;
    int i, result = 1;
    for (i = n ; i >= 1; --i)
    result = result*i+1;
    cout < < result-1 < < endl;
    return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tbocd
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 12:51:4177楼 得分:0
    引用 64 楼 nicky_zs 的回复:
    int s = 1;
    for (int i = n; i > 1; --i) {
    s = s * i + 1;
    }
    return s;


    发现跟我想法一样,不过处理临界1上还是你的简单呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bigeon
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-23 21:08:5178楼 得分:0
    最简单的理解...乘法器+加法器......
    修改 删除 举报 引用 回复