标题: 我用C++写的一个阶乘,支持任意大的数
diejia
新生入学
Rank: 1
注册用户



UID 171206
精华 0
积分 0(积分有什么用?)
帖子 15
阅读权限 10
注册 2006-10-27
状态 离线
发表于 2007-4-6 08:36  资料  个人空间  短消息  加为好友 
我用C++写的一个阶乘,支持任意大的数

#include <iostream>
{[*O(K,B/ZGusing namespace std;.w"@ CH'H9v8J
#define MAX 25
Wh8|s.xk&v"X&a:~www.linuxeden.comvoid Numplus(int plus[],int num)
j.W@        YUGBwww.linuxeden.com{ 0out%Id J8Y
   int count,sum[MAX],ph;www.linuxeden.com/TTO:R)`MlG%T_
C

       for(int j=0;j<MAX;j++)
7yA'g        wT
uW&X
        { +R@[C
@zs,G

                 sum[j] = 0;Hj m }%Gz
          }
UKM9n#h*l        if (num == 1) U$O*?+M;FF
            {*Zgcn
UEI&Qo_[(b

             plus[0]=1;
p        c0OU'e9[2N8uSwww.linuxeden.com               www.linuxeden.commR#}$EN,|2v
             }P N-G1b'~
`3j-S5{$E

         else www.linuxeden.com:q v!c~Gtrd
           {
w8A6t#A*wx             for(int i=0;i<MAX;i++)/flTnpP$K
                  {www.linuxeden.com"P f$~4}SOv/r
                    count = plus*num;
z!G@*@%R$]                       if(count>999)'t\vW@q(f
                         {HIf2Sv7V0z
                             plus  = count%1000;
|-X        r[6te-|Linux伊甸园论坛                             sum[i+1] =  count/1000;www.linuxeden.com(R-D
~$` r#T2]5x^3H

                           }www.linuxeden.comN @%D*oU5A        a
                        elseo
w,e2n(\,w'?

                         {
)Hpcc.}e~Linux伊甸园论坛                               plus = count;  
Zm8^-~2nc                           }
M:Tp3Si"HPqwww.linuxeden.com                       }8KW-p}.w^]^*hf
               for(int m=0;m<MAX;m++)
e;tI D
Te7EF        H
                {Linux伊甸园论坛rjff#L*H5K o?
                     ph=plus[m]+sum[m];   
r
D
B|n6FD        C e&h
                     if(ph<=999)
VI7yufy

                     {%W)fg.t7O3_
                         plus[m]=ph; i%Rk!Q0a6i\-t7U
                      }DRK\$N"EaXH
J0WA

                     else if(ph>999)Linux伊甸园论坛L1CU4spj
                      {www.linuxeden.comMVG&wE M;~pyy*}
                         plus[m] = ph%1000;2iIfm7H3d
X

                         sum[m+1]=sum[m+1]+(ph/1000);     u!vnQ?R$Hn/~
                        }
TEJ'UE!L0F                 }www.linuxeden.comD x;J;ov;q9C

9zdyl
ULinux伊甸园论坛
               }Linux伊甸园论坛9J"KF3_[I
},LNou?6Un#z'uU A
int main (int argc, void* argv[])
V7P6Lp-vt)Y%DI!eLinux伊甸园论坛{ b;`5H:gH3]~X~L
    int n,num;
9J| OS5@2d u H P q    int static plus[MAX];Sw        o\N2P T;b/?IBc
    cout<<"input plus number:";G6S6_        Zu(i
    cin>>n;
F        P"?-rru    for(int i=0;i<MAX;i++)a"P"v\q^:M$rhx
       {6?'RXqI$N?
          plus = 0;
4WY'vv\w"YUwww.linuxeden.com        }%oV Zy
Z

    for(num=1;num<(n+1);num++)
a#f"t!m'qP-IBwww.linuxeden.com        { !XMcr&M
           Numplus(plus,num);//计算阶乘
#V&P@&a.I&E#N.?qwww.linuxeden.com      
b7V1d3[4_9XS"C4j         }
$zt\r(G^~OLinux伊甸园论坛     //输出阶乘
,c%TqKA(U Z;sD)wwww.linuxeden.com    for(int j=MAX-1;j--;j>=0)L1A(u1Kll
        {
+`!T&f\)o*@www.linuxeden.com           if((plus[j] == 0)&&(plus[j-1] != 0))
d'RP%o_
[.FZ
                 {
Nt1h4i9}Qg                  num=j-1;www.linuxeden.com4r~yVt#` R qm4J
                 +[/[)W^V0i S
                  break;/E(YHLE,\Wo9b
                   }
A?Hg@8z3^)PSWsL5O            else continue;
%x:?FsYNen R         }
K:_.[s#\EI      cout<<"The plus of "<<n<<" is:";
J^ o\3x;v,S"d      
Cf?%nSG&U*t5D.WTeLinux伊甸园论坛      for(int t=num;t>=0;t--)

h0`Z$N5zu2z_*A4E
          { www.linuxeden.com3pV6X T'U;R+^aO
                if(plus[t] == 0)jY.a#S6?q`&@
                      {8WK!hY:N[
                        cout<<"000";Linux伊甸园论坛        xz)bXp3R
                       }7x;uw0P`]n
                 else if((plus[t] <= 999)&&(plus[t] > 99))www.linuxeden.com_yve E
                       {DY
asxBp

                           cout<<plus[t];g~h)_`;Qe
                        }
O0``~ tu%yR$jLinux伊甸园论坛                 else if((plus[t] <= 99)&&(plus[t] > 9)) %Jm$Q8lu
                        {t@ye4uO
                            if(t==num)www.linuxeden.com-soj];RCD
                                     {
i
PA
[ULinux伊甸园论坛
                                 cout<<plus[t];Linux伊甸园论坛V-V#RVX-f\u
                                      }
)ExR2S1h'a2m7l8n9Uwww.linuxeden.com                             else
Y5?9L1uv                                       {
,k'HEO([%V3gt)uLinux伊甸园论坛                                     cout<<"0";
&fU^(u/oG-G                                     cout<<plus[t]; Xx ff^hd7g1T
                                        }   
F7q
?-T"V1o;@E:G
                          }Linux伊甸园论坛4s;X.kMQa;w
                  else if((plus[t]<= 9)&&(plus[t] >= 1))
xA0\        x#}AS
jLinux伊甸园论坛
                          {
#iyoY9j
aRLinux伊甸园论坛
                            if(t==num)
,K,fl*M;F5d4gi_'fLinux伊甸园论坛                                     {
qD^
LX'^7R

                                 cout<<plus[t];:K2U
u9q        YJYh

                                      }

H"J\?,X N!`R
                            else$nT2]Y-?xT
                                    {A2`tjv,\T
                                   cout<<"00";
/W sg$N-C1iC!Pj`www.linuxeden.com                                   cout<<plus[t];  
&H mz
H.{8Rwww.linuxeden.com
                                    }  
'^Rp AL        N DiALinux伊甸园论坛                           }?,iZN"j I$]
             }
'o1v^7D:h3M}'i#i               cout<<endl;*nd'[`tt5{|

%ab z M}.t"b*a q{:MF


naZ6h(p#@d
编程思想:由于大数阶乘结果无法用float、int 等数据类型保存,所以在这里我用一个数组plus[MAX]保存,一个里面最大保存一个三位数字,但也可以保存2位数或一位数,那么plus[MAX]最多能保存MAX*3位数,这样就解决了数据类型无法保存结果的问题。

顶部
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-4-6 10:16  资料  个人空间  短消息  加为好友 
这么算阶乘没什么意义,我记得一般好像是用2的阶乘换算的





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
不容错过的IBM 集群技术资源汇总
diejia
新生入学
Rank: 1
注册用户



UID 171206
精华 0
积分 0(积分有什么用?)
帖子 15
阅读权限 10
注册 2006-10-27
状态 离线
发表于 2007-4-6 22:27  资料  个人空间  短消息  加为好友 
用2的阶乘换算怎么个换算,那怎么才能够保存最后的结果,特别是结果有60多位甚至上百位的时候,就像50的阶乘就至少有五、六十位,这样该怎么保存。

顶部
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-4-10 18:05  资料  个人空间  短消息  加为好友 
不错,相比较而言你也就是将保存的工作做好了。





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
不容错过的IBM 集群技术资源汇总
alex32108
新生入学
Rank: 1
注册用户



UID 191338
精华 0
积分 0(积分有什么用?)
帖子 2
阅读权限 10
注册 2007-4-21
状态 离线
发表于 2007-4-21 22:03  资料  个人空间  短消息  加为好友 
我曾经用C做了一个,打了一屏幕的数字,才做到600多的阶乘,做任意的那不知道要打到什么时候!

顶部
 



当前时区 GMT+8, 现在时间是 2008-5-17 04:00

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.153613 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP