当前位置: 首页 > >

4行代码计算9999的阶乘

发布时间:

4 行代码计算 9999 的阶乘
本文来源于 csdn2001 年的一个帖子,题目是有谁可以用四行代码求出 1000000 的阶乘!! !, 见 http://topic.csdn.net/t/20001226/11/52263.html,我在该帖中给出了代码。但严格的将,这 个代码的行数并未控制在 4 行以内。 这次给出一个只用 4 行代码计算 10000 以内的阶乘的完 整程序,并给出代码优化(压缩)过程) 下面看看这个程序的最初形式 1.//第一版,正常的格式 2.#define N 10 //计算 N 的阶乘,最多只能算到 9999 3.long a[8916]={1,0},n,i,c,len; 4.int main() 5.{ 6. n=N; 7. for ( len=1;n>1; n--) 8. { 9. for (c=0,i=0; i<len;i++) 10. { 11. long p= a[i]*n+c; 12. a[i]= p % 10000; 13. c=p / 10000; 14. } 15. a[i]= c; 16. if (c>0) 17. len++; 18. } 19. printf("%d",a[len-1]); 20. for( len--;len>=0;len--) 21. printf("%04d",a[len]); 22. return 0; 23.} 代码的首次改进,压缩代码行数 1.// 第二版: 将打印语句缩写到 1 行,同时化简计算部分的内循环 2.#define N 100 //计算 N 的阶乘,最多只能算到 9999 3.long a[8916]={1,0},n,i,c,len; 4.int main() 5.{ 6. n=N; 7. for ( len=1;n>1; n--) 8. { 9. for (c=0,i=0; i<len;i++) 10. {

11. a[i]= ( c+= a[i]*n ) % 10000; c/=10000; 12. } 13. a[i]= c; 14. if (c>0) 15. len++; 16. } 17. for( len--,printf("%d",a[len--]);len>=0; len--) printf("%04d",a[len]); 18. 19. return 0; 20.} 进一步改进 1.// 版本 3:将外循环的最后 2 条语句改为一个 "?" 语句 将 2.#define N 10 //计算 N 的阶乘,最多只能算到 9999 3.long a[8916]={1,0},n,i,c,len; 4.int main() 5.{ 6. n=N; 7. for ( len=1;n>1; n--) 8. { 9. for (c=0,i=0; i<len;i++ ) 10. { 11. a[i]= ( c+= a[i]*n ) % 10000; c/=10000; 12. } 13. 14. ((a[i]=c)>0)?len++:0; 15. } 16. for( len--,printf("%d",a[len--]);len>=0; len--) printf("%04d",a[len]); 17. 18. return 0; 19.} 再次改进 1.// 版本 4 2.// 将内循环中的两条语句变成一条语句,用逗号分隔,去掉{} 3.// 将外循环最后一行 和 外循环 for 语句第三部分 "n--"合并, 4.// 进行格式重排,将 main 函数和变量定义语句放入一行 5.// 将将 len 从 1 开始改为从 0 开始 6.#include <stdio.h> 7.#define N 10 //计算 N 的阶乘,修改 N 的定义可计算 10000 以内任意数的阶乘 8.long a[N]={1,0},n,i,c,len; void main() { 9.for ( n=N,len=0;n>1;((a[i]=c)>0) ? (len++,n--) : n--) 10. for (c=0,i=0; i<=len;i++ ) a[i]= ( c+= a[i]*n ) % 10000, c/=10000;

11.for( printf("%d",a[len--]);len>=0; len--) printf("%04d",a[len]); } 版本 5,进一步优化,不算 include, #define 及回车换行符,只有 170 个 byte. 主要改进有: 1. 删除多余的空格 2. "a[8916]={1,0}" 改为 "a[N]={1}",节省 5 个字符 3. 变量赋值 n=N 放到变量声明语句,减少 1 个字符 4. len 改为单变量 m, 减少了 10 个以上的字符 5. 全局变量自动初始化为 0,len=0,这句去掉 6. "((a[i]=c)>0)?(m++,n--):n--" 改为 "(a[i]=c)>0?m++:0,n--",节省了 6 个字符 7. 最 后 一 个 for 语 句 中 , 由 "printf("%d",a[m--]);m>=0;m--" 调 整 为 "printf("%d",a[m]);--m>=0;", 节省了 4 个字符 8. 虽然说 long 改为 int 可节约一个字符,但这样的话,在 16 为编译器的运行结果将出错, 失去了通用性 1.//版本 5 2.#include <stdio.h> 3.#define N 10 //计算 N 的阶乘,修改 N 的定义可计算 10000 以内任意数的阶乘 4.long a[N]={1},n=N,i,c,m;void main(){ 5.for(;n>1;(a[i]=c)>0?m++:0,n--) 6.for(c=0,i=0;i<=m;i++)a[i]=(c+=a[i]*n)%10000,c/=10000; 7.for(printf("%d",a[m]);--m>=0;)printf("%04d",a[m]);} 版本 6,再次改进,又减少 11 个字符,扣除#include 和 #define 语句,共 159 个字节 1.#include <stdio.h> 2.#define N 10 //计算 N 的阶乘,修改 N 的定义可计算 10000 以内任意数的阶乘 3.int a[N]={1},n=N,i,c,m;void main(){ 4.for(;n;(a[i]=c)>0?m++:0,n--) 5.for(c=i=0;i<=m;i++)a[i]=(c+=a[i]*n)%10000,c/=10000; 6.for(c=m+1;c;)printf(c>m?"%d":"%04d",a[--c]);} 版本 7:采用 10 进制,在主流编译器可以实现 1-200000 的阶乘,扣除#include 和 #define 语句,共 153 个字节,但是速度较慢。 1.#include <stdio.h> 2.#define N 10 //计算 N 的阶乘,修改 N 的定义可计算 200000 以内任意数的阶乘 3.int a[N*5]={1},n=N,i,c,m;void main(){ 4.for(;n;n--){ 5.for(c=i=0;i<=m;i++)a[i]=(c+=a[i]*n)%10,c/=10; 6.while(c)a[++m]=c%10,c/=10;} 7.for(;m>=0;)printf("%d",a[m--]);}




友情链接: