用C语言编写程序,求出1000的阶乘?

用C语言编写程序,求出1000的阶乘?,第1张

给你个通用的。运行后输入1000。 #define M 20000 /* 最大结果位数,DOS能访问的内存有限,最好不要超过 30000 位*/ #define N (M+5) main() { int Num register int i,j,k,flag register unsigned int n,m,pc unsigned char str_n[5],result_0[N],result_1[ N] void fun_print_result(char *result,int flag) int fun_mul(char *a,char *b,char *c,int flag) printf("输入计算其阶乘的数:Num = ") scanf("%d",&Num) if(Num >= 100) { printf("\n正在进行阶乘运算. . .\n") printf("已完成 00000 的阶乘,请等待. . .") } for (j=0j<Nj++) { result_1[j] = 0result_0[j] = 0 } result_1[N-1] = 1 for(i=0i<5i++) { str_n[i] = 0 } n = 1 pc = 0flag = N-1 while (n <= Num) { m = n k = 4 while(m >0) { str_n[k] = m%10m /= 10k-- } if (pc%2 == 0) { if(fun_mul (str_n,result_1,result_0,flag) != 1) { printf("\n\n结果溢出!当前所设置的最大结果为 %d 位 已完成 %d 的阶乘",M,pc) exit(0) } } else { if(fun_mul (str_n,result_0,result_1,flag) != 1) { printf("\n\n结果溢出!当前所设置的最大结果为 %d 位 已完成 %d 的阶乘",M,pc) exit(0) } } flag = flag-(4-k)/* flag 标记相乘后“可能的”第一个有效数字的标号 */ if(pc%2 == 0) /* 再处理一次使 flag 正好标记第一个有效数字的标号 */ { if(result_0[flag] == 0) flag++ } else { if(result_1[flag] == 0) flag++ } n++pc++ if((pc)%25 == 0 &&Num >= 100 &&pc >= 100) { printf("\r已完成 %5d",pc) } } if(Num >= 100) printf("\n") if ((pc-1)%2 == 0) { fun_print_result (result_0,flag) } else { fun_print_result (result_1,flag) } } int fun_mul(char *a,char *b,char *c,int flag) /* 相乘函数 */ { register int i,j for(j=flagj<Nj++) c[j]=0 for(i=4i>=0i--) { if(a) { for (j=N-1j>=flagj--) { if(b[j]) { c[i+j-4] += a[i]*b[j] } if(c[i+j-4] >9) { c[i+j-5] += c[i+j-4]/10c[i+j-4] %= 10 } } } } if(flag <10) { if (c[0] || c[1] || c[2] || c[3] || c[4]) /*** 结果溢出判断 ***/ { return 0 } } return 1 } void fun_print_result(char *result,int flag) /* 输出结果函数 */ { int p printf("\n本次计算结果共有 %d 位,如下:\n\n",N-flag) for(p=flagp<N-1p++) { printf("%d",result[p]) if((p+1-flag)%(21*80) == 0) { printf("\n计算结果太长,请按任一键看下一屏,Esc 退出") if(getch() == 27) { clrscr()exit(0) } clrscr() } } printf("%d",result[N-1]) printf("\n\n[OK]") } 算出来1000的阶乘为: 本次计算结果共有 2568 位,如下: 402387260077093773543702433923 003985719374864210714632543799 910429938512398629020592044208 486969404800479988610197196058 631666872994808558901323829669 944590997424504087073759918823 627727188732519779505950995276 120874975462497043601418278094 646496291056393887437886487337 119181045825783647849977012476 632889835955735432513185323958 463075557409114262417474349347 553428646576611667797396668820 291207379143853719588249808126 867838374559731746136085379534 524221586593201928090878297308 431392844403281231558611036976 801357304216168747609675871348 312025478589320767169132448426 236131412508780208000261683151 027341827977704784635868170164 365024153691398281264810213092 761244896359928705114964975419 909342221566832572080821333186 116811553615836546984046708975 602900950537616475847728421889 679646244945160765353408198901 385442487984959953319101723355 556602139450399736280750137837 615307127761926849034352625200 015888535147331611702103968175 921510907788019393178114194545 257223865541461062892187960223 838971476088506276862967146674 697562911234082439208160153780 889893964518263243671616762179 168909779911903754031274622289 988005195444414282012187361745 992642956581746628302955570299 024324153181617210465832036786 906117260158783520751516284225 540265170483304226143974286933 061690897968482590125458327168 226458066526769958652682272807 075781391858178889652208164348 344825993266043367660176999612 831860788386150279465955131156 552036093988180612138558600301 435694527224206344631797460594 682573103790084024432438465657 245014402821885252470935190620 929023136493273497565513958720 559654228749774011413346962715 422845862377387538230483865688 976461927383814900140767310446 640259899490222221765904339901 计算结果太长,请按任一键看下一屏,Esc 退出8860185665264850617997023561 938970178600408118897299183110 211712298459016419210688843871 218556461249607987229085192968 193723886426148396573822911231 250241866493531439701374285319 266498753372189406942814341185 201580141233448280150513996942 901534830776445690990731524332 782882698646027898643211390835 062170950025973898635542771967 428222487575867657523442202075 736305694988250879689281627538 488633969099598262809561214509 948717012445164612603790293091 208890869420285106401821543994 571568059418727489980942547421 735824010636774045957417851608 292301353580818400969963725242 305608559037006242712434169090 041536901059339838357779394109 700277534720000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 00000000000000000000 [OK]

int func(void)

{

    long result = 1

    unsigned int i = 1000

    for (i=1000 i>0 i--) 

    {

        result = result * i

    }

    

    return result

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7951172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存