前段时间发了一个 "4行代码(170个字符)计算10000以内的阶乘"(http://topic.csdn.net/u/20081107/12/bbe2be15-2a95-48ef-80db-21cd756ee7c9.html),招致板砖无数,好多人都把注意力集中在代码的编写风格上,而几乎没有人探讨如何压缩代码的技巧。
这次重发此帖,希望将注意力集中在探讨压缩代码的技巧上,对优秀的回复,高分赠送,必要时开新贴赠分。
先贴出我的2个版本。
版本1:采用万进制,在主流编译器可以实现1-10000的阶乘,扣除#include 和 #define语句,共167个字节。
#define N 10 //计算N的阶乘,修改N的定义可计算10000以内任意数的阶乘
int a[N]={1},n=N,i,c,m;void main(){
for(;n>1;(a[i]=c)>0?m++:0,n--)
for(c=i=0;i<=m;i++)a[i]=(c+=a[i]*n)%10000,c/=10000;
for(printf("%d",a[m]);--m>=0;)printf("%04d",a[m]);}
版本2:采用10进制,在主流编译器可以实现1-200000的阶乘,扣除#include 和 #define语句,共142个字节,但是速度较慢。
#define N 10 //计算N的阶乘,修改N的定义可计算200000以内任意数的阶乘
int a[N]={1},n=N,i,c,m;void main(){
for(;n>1;(a[i]=c)>0?m++:0,n--)
for(c=i=0;i<=m;i++)a[i]=(c+=a[i]*n)%10,c/=10;
for(;m>=0;)printf("%d",a[m--]);}
其实,我早在2000年末,就尝试过用较少的代码计算大数阶乘,请参阅帖子
有谁可以用四行代码求出1000000的阶乘!!!
另外,雨中飞燕也尝试过写类似的程序,请参阅雨中飞燕的博客
原创]四行代码算1000阶乘精确值 -- 雨中飞燕之家 -- 编程爱好者BLOG