首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求1000的阶乘! [已结贴,结贴人:fanxiaofeng19577494]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-24 17:53:02 楼主
    要求结果不要为0或正无穷大!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-24 17:54:571楼 得分:1
    http://forum.csdn.net/PointForum/Manage/TopicManageView.aspx?forumID=5fc6f290-9ab1-492e-af2c-fbd31e9e3002&topicID=ddefc05f-36c4-4ae3-8e91-404f38d0a54c&date=2008-6-21+19%3a54%3a30


    C/C++ code
    //下面是求10000的阶乘 #include <stdio.h> typedef struct BigNum_ { int data[10000]; int n; } BigNum; BigNum* carry(BigNum* bn, int curr, int valid, int inc) { return curr>=valid && inc ? (++bn->n, bn->data[curr] = inc%10000, carry(bn, curr+1, valid, inc/10000)) : bn; } BigNum* mul(BigNum* bn, int n, int curr, int valid, int inc) { int t = inc+bn->data[curr]*n; return curr >= valid ? carry(bn, curr, valid, inc) : (bn->data[curr]=t%10000, mul(bn, n, curr+1, valid, t/10000)); } BigNum* power(BigNum* bn, int n, int p) { return --p ? (power(bn, n, p), mul(bn, n, 0, bn->n, 0)) : (bn->n=1, bn->data[0] = n, bn); } BigNum* fac(BigNum* bn, int n) { return n ? (fac(bn, n-1), mul(bn, n, 0, bn->n, 0)): (bn->n=1, bn->data[0] = 1, bn); } void show(BigNum* bn, int curr) { if (curr != bn->n) { show(bn, curr+1); curr == bn->n -1 ? printf("%d", bn->data[curr]) : printf("%04d", bn->data[curr]); !curr ? puts("") : 0; } } BigNum n; int main(int argc, char* argv[]) { show(fac(&n, 10000), 0); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-24 18:02:562楼 得分:0
    我试下,多谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    发表于:2008-06-24 19:26:533楼 得分:1
    http://www.cppblog.com/canbingzt/archive/2007/11/18/36864.html
    有一个专门的大数类,可以计算大数(不限制位数)的加法和乘法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • blooney
    • 等级:
    发表于:2008-06-24 19:35:014楼 得分:1
    我还以为是要个结果呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-24 19:54:405楼 得分:1
    我自己写的一个大数阶乘的程序~~
    #include "stdafx.h"
    #include <iostream.h>
    struct result
    {
    int wei[10000];
    int weishu;
    };
    result bigjie(int n)
    {
    result bigresult;
    int i=0,j=0,temp=0;int valid=1;
    if(n <0){cout < <"输入值应该大于或者等于0";bigresult.weishu=0;return bigresult ;}
    else if(n==0 ¦ ¦n==1){bigresult.wei[0]=1;bigresult.weishu=1;return bigresult;}
    else
    {
    bigresult.wei[0]=1;


        for(i=2;i <=n;i++)
    {

      int charge=0;
      for(j=0;j <valid;j++)
      {
    temp=bigresult.wei[j]*i+charge;
    bigresult.wei[j]=temp%10;
    charge=temp/10;

      }
     

      while(charge!=0)
      {
     
      bigresult.wei[valid++]=charge%10;
      charge=charge/10;

      }

    }
     
      bigresult.weishu=valid;
      return bigresult;
    }


    }
    void main()
    {
    cout < <"请输入数值";
    int x;
    cin>>x;
    cout < <bigjie(x).weishu < <endl;
    for(int i=bigjie(x).weishu-1;i>=0;i--)
    {
    cout < <bigjie(x).wei[i];

    }
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-24 21:56:296楼 得分:1
    高手都写完了~
    菜鸟就飘过算了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 02:47:247楼 得分:1
    俺写的虽然不限位数。但是运行的太慢,,也没脸搞出来了。。
    278418665840213040799889769847582979863300017578438956037140085617
    998609714376428811073008772387162345060336192945852834506033619294
    585283406577885059807182029430615814760743837221170044394990138985
    500018359925429934190056959700270016052579046842620478258357926802
    622334074818280365888637401416916012828077655864191610256857912158
    20
    先打个头。。后面还好几页呢。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 05:56:278楼 得分:1
    10 ^ (log(1) + log(2) + ... + log(100))
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 09:30:119楼 得分:1
    VC2003,试验1楼,error: Stack overflow ~~~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 09:37:4010楼 得分:1
    4.02387260077093773543702433923e+2567
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 09:46:1211楼 得分:0
    把一楼的10000改成1000

    4023872600770937735437024339230039857193
    7486421071463254379991042993851239862902

    0592044208486969404800479988610197196058
    6316668729948085589013238296699445909974

    2450408707375991882362772718873251977950
    5950995276120874975462497043601418278094

    6464962910563938874378864873371191810458
    2578364784997701247663288983595573543251

    3185323958463075557409114262417474349347
    5534286465766116677973966688202912073791

    4385371958824980812686783837455973174613
    6085379534524221586593201928090878297308

    4313928444032812315586110369768013573042
    1616874760967587134831202547858932076716

    9132448426236131412508780208000261683151
    0273418279777047846358681701643650241536

    9139828126481021309276124489635992870511
    4964975419909342221566832572080821333186

    1168115536158365469840467089756029009505
    3761647584772842188967964624494516076535

    3408198901385442487984959953319101723355
    5566021394503997362807501378376153071277

    6192684903435262520001588853514733161170
    2103968175921510907788019393178114194545

    2572238655414610628921879602238389714760
    8850627686296714667469756291123408243920

    8160153780889893964518263243671616762179
    1689097799119037540312746222899880051954

    4441428201218736174599264295658174662830
    2955570299024324153181617210465832036786

    9061172601587835207515162842255402651704
    8330422614397428693306169089796848259012

    5458327168226458066526769958652682272807
    0757813918581788896522081643483448259932

    6604336766017699961283186078838615027946
    5955131156552036093988180612138558600301

    4356945272242063446317974605946825731037
    9008402443243846565724501440282188525247

    0935190620929023136493273497565513958720
    5596542287497740114133469627154228458623

    7738753823048386568897646192738381490014
    0767310446640259899490222221765904339901

    8860185665264850617997023561938970178600
    4081188972991831102117122984590164192106

    8884387121855646124960798722908519296819
    3723886426148396573822911231250241866493

    5314397013742853192664987533721894069428
    1434118520158014123344828015051399694290

    1534830776445690990731524332782882698646
    0278986432113908350621709500259738986355

    4277196742822248757586765752344220207573
    6305694988250879689281627538488633969099

    5982628095612145099487170124451646126037
    9029309120889086942028510640182154399457

    1568059418727489980942547421735824010636
    7740459574178516082923013535808184009699

    6372524230560855903700624271243416909004
    1536901059339838357779394109700277534720

    0000000000000000000000000000000000000000
    0000000000000000000000000000000000000000

    0000000000000000000000000000000000000000
    0000000000000000000000000000000000000000

    0000000000000000000000000000000000000000
    0000000000000000000000000000000000000000

    00000000
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 09:58:0612楼 得分:1
    引用 6 楼 lijiawlm 的回复:
    高手都写完了~
    菜鸟就飘过算了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:01:0913楼 得分:0
    飞雪你太强了!~
    这个程序结果打了好几屏……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:02:2414楼 得分:1
    又见此题!
    C/C++ code
    compute 1000! comput time: 6562 ms Result = 4023872600770937735437024339230 0398571937486421071463254379991042993851 2398629020592044208486969404800479988610 1971960586316668729948085589013238296699 4459099742450408707375991882362772718873 2519779505950995276120874975462497043601 4182780946464962910563938874378864873371 1918104582578364784997701247663288983595 5735432513185323958463075557409114262417 4743493475534286465766116677973966688202 9120737914385371958824980812686783837455 9731746136085379534524221586593201928090 8782973084313928444032812315586110369768 0135730421616874760967587134831202547858 9320767169132448426236131412508780208000 2616831510273418279777047846358681701643 6502415369139828126481021309276124489635 9928705114964975419909342221566832572080 8213331861168115536158365469840467089756 0290095053761647584772842188967964624494 5160765353408198901385442487984959953319 1017233555566021394503997362807501378376 1530712776192684903435262520001588853514 7331611702103968175921510907788019393178 1141945452572238655414610628921879602238 3897147608850627686296714667469756291123 4082439208160153780889893964518263243671 6167621791689097799119037540312746222899 8800519544441428201218736174599264295658 1746628302955570299024324153181617210465 8320367869061172601587835207515162842255 4026517048330422614397428693306169089796 8482590125458327168226458066526769958652 6822728070757813918581788896522081643483 4482599326604336766017699961283186078838 6150279465955131156552036093988180612138 5586003014356945272242063446317974605946 8257310379008402443243846565724501440282 1885252470935190620929023136493273497565 5139587205596542287497740114133469627154 2284586237738753823048386568897646192738 3814900140767310446640259899490222221765 9043399018860185665264850617997023561938 9701786004081188972991831102117122984590 1641921068884387121855646124960798722908 5192968193723886426148396573822911231250 2418664935314397013742853192664987533721 8940694281434118520158014123344828015051 3996942901534830776445690990731524332782 8826986460278986432113908350621709500259 7389863554277196742822248757586765752344 2202075736305694988250879689281627538488 6339690995982628095612145099487170124451 6461260379029309120889086942028510640182 1543994571568059418727489980942547421735 8240106367740459574178516082923013535808 1840096996372524230560855903700624271243 4169090041536901059339838357779394109700 2775347200000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 00000000000000000 output time: 500 ms 请按任意键继续. . .

    《大整数类的实现》http://blog.csdn.net/daidodo/archive/2008/02/24/2116725.aspx
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:06:3615楼 得分:0
    我的是32ms
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:07:1216楼 得分:0
    32ms = 计算时间+输出时间
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:14:5017楼 得分:0
    引用 15 楼 baihacker 的回复:
    我的是32ms


    我用了下是3828ms,我机器CPU是T5600 1.83GHz
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:17:2918楼 得分:0
    我的是
    Intel(R) Celeron(R) M processor 1.4G
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:18:1819楼 得分:0
    引用 17 楼 yyyapple 的回复:
    引用 15 楼 baihacker 的回复:
    我的是32ms


    我用了下是3828ms,我机器CPU是T5600 1.83GHz

    记得把主函数中的10000改成1000
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:21:4120楼 得分:0
    引用 19 楼 baihacker 的回复:
    引用 17 楼 yyyapple 的回复:
    引用 15 楼 baihacker 的回复:
    我的是32ms


    我用了下是3828ms,我机器CPU是T5600 1.83GHz

    记得把主函数中的10000改成1000


    哦,不好意思,恩,对的,差不多32ms
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 10:41:1121楼 得分:1
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 12:51:1822楼 得分:1
    飞雪能大概的解释下吗? 很难懂哈。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 11:13:0923楼 得分:1
    mark!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    发表于:2008-06-27 11:29:1724楼 得分:1
    俺的,15ms
    C/C++ code
    #include <algorithm> #include <vector> #include <cstdio> #include<functional> #include<time.h> typedef unsigned int Type; enum { BASE_DATA = 10000, MAX_NUM = 1000 , MAX_SIZE = MAX_NUM+1000}; struct ConverData { inline Type operator()(Type x) { Type y = (x/1000); x %= 1000; y += ( x/ 100)<<8; x %= 100; y += ( x / 10)<<16; y += (x % 10)<<24; return y + 0x30303030 ; } }; int main(int , char* []) { clock_t start = clock(); std::vector<Type> v; v.reserve(MAX_SIZE); v.push_back(1); v.push_back(0); for(int x= 2 ; x < MAX_NUM +1 ; ++ x) { std::transform(v.begin() ,v.end(),v.begin(),std::bind2nd(std::multiplies<Type>(),x)); std::vector<Type>::iterator i = v.begin(); for(; i+1!=v.end();++i){ *(i+1) += (*i)/BASE_DATA ; (*i) %= BASE_DATA; } if( *i >= BASE_DATA ){ Type temp = (*i)/BASE_DATA ; (*i) %= BASE_DATA; v.push_back( temp ); } } std::reverse(v.begin() ,v.end() ); v.erase( v.begin() , std::find_if( v.begin() ,v.end() , std::bind2nd(std::not_equal_to<Type>(),0) ) );//移除结果开头的0 std::transform( v.begin() ,v.end() , v.begin() , ConverData() );//转化成字符串 v.push_back(0); std::printf("%s\n",&v[0]); std::printf("%d\n",clock()-start); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 11:31:0925楼 得分:0
    引用 24 楼 akirya 的回复:
    俺的,15ms

    我故意用的递归......导致速度变慢.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    发表于:2008-06-27 11:33:0426楼 得分:0
    再补充一下,俺得代码用g++ -O3编译运行的时候 会经常0秒
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    发表于:2008-06-27 11:42:1527楼 得分:0
    最终版本

    使用多媒体定时器获得精确一些的时间
    g++的4ms

    编译方法
    //cl test.cpp /O2 Winmm.lib
    // g++ test.cpp -O3 lwinmm

    C/C++ code
    #include <algorithm> #include <vector> #include <cstdio> #include<functional> #include<time.h> #include<windows.h>