找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2533|回復(fù): 0
收起左側(cè)

單片機(jī) 求階乘 -C語(yǔ)言

[復(fù)制鏈接]
ID:90014 發(fā)表于 2015-9-15 15:04 | 顯示全部樓層 |閱讀模式
  1. #define M 20000 /* 最大結(jié)果位數(shù),DOS能訪問(wèn)的內(nèi)存有限,最好不要超過(guò) 30000 位*/
  2. #define N (M+5)
  3. main()
  4. {
  5. int Num;
  6. register int i,j,k,flag;
  7. register unsigned int n,m,pc;
  8. unsigned char str_n[5],result_0[N],result_1[N];
  9. void fun_print_result(char *result,int flag);
  10. int fun_mul(char *a,char *b,char *c,int flag);

  11. printf("輸入計(jì)算其階乘的數(shù):Num = ");
  12. scanf("%d",&Num);

  13. if(Num >= 100)
  14. {
  15. printf("\n正在進(jìn)行階乘運(yùn)算. . .\n");
  16. printf("已完成 00000 的階乘,請(qǐng)等待. . .");
  17. }

  18. for (j=0;j<N;j++)
  19. {
  20. result_1[j] = 0; result_0[j] = 0;
  21. }
  22. result_1[N-1] = 1;
  23. for(i=0;i<5;i++)
  24. {
  25. str_n[i] = 0;
  26. }

  27. n = 1;
  28. pc = 0; flag = N-1;
  29. while (n <= Num)
  30. {
  31. m = n;
  32. k = 4;
  33. while(m > 0)
  34. {
  35. str_n[k] = m%10; m /= 10; k--;
  36. }
  37. if (pc%2 == 0)
  38. {
  39. if(fun_mul (str_n,result_1,result_0,flag) != 1)
  40. {
  41. printf("\n\n結(jié)果溢出!當(dāng)前所設(shè)置的最大結(jié)果為 %d 位 已完成 %d 的階乘",M,pc);
  42. exit(0);
  43. }
  44. }
  45. else
  46. {
  47. if(fun_mul (str_n,result_0,result_1,flag) != 1)
  48. {
  49. printf("\n\n結(jié)果溢出!當(dāng)前所設(shè)置的最大結(jié)果為 %d 位 已完成 %d 的階乘",M,pc);
  50. exit(0);
  51. }
  52. }

  53. flag = flag-(4-k); /* flag 標(biāo)記相乘后“可能的”第一個(gè)有效數(shù)字的標(biāo)號(hào) */

  54. if(pc%2 == 0) /* 再處理一次使 flag 正好標(biāo)記第一個(gè)有效數(shù)字的標(biāo)號(hào) */
  55. {
  56. if(result_0[flag] == 0) flag++;
  57. }
  58. else
  59. {
  60. if(result_1[flag] == 0) flag++;
  61. }
  62. n++; pc++;
  63. if((pc)%25 == 0 && Num >= 100 && pc >= 100)
  64. {
  65. printf("\r已完成 %5d",pc);
  66. }
  67. }
  68. if(Num >= 100) printf("\n");
  69. if ((pc-1)%2 == 0)
  70. {
  71. fun_print_result (result_0,flag);
  72. }
  73. else
  74. {
  75. fun_print_result (result_1,flag);
  76. }
  77. }

  78. int fun_mul(char *a,char *b,char *c,int flag) /* 相乘函數(shù) */
  79. {
  80. register int i,j;
  81. for(j=flag;j<N;j++) c[j]=0;
  82. for(i=4;i>=0;i--)
  83. {
  84. if(a)
  85. {
  86. for (j=N-1;j>=flag;j--)
  87. {
  88. if(b[j])
  89. {
  90. c[i+j-4] += a[i]*b[j];
  91. }
  92. if(c[i+j-4] > 9)
  93. {
  94. c[i+j-5] += c[i+j-4]/10; c[i+j-4] %= 10;
  95. }
  96. }
  97. }
  98. }
  99. if(flag < 10)
  100. {
  101. if (c[0] || c[1] || c[2] || c[3] || c[4]) /*** 結(jié)果溢出判斷 ***/
  102. {
  103. return 0;
  104. }
  105. }
  106. return 1;
  107. }

  108. void fun_print_result(char *result,int flag) /* 輸出結(jié)果函數(shù) */
  109. {
  110. int p;
  111. printf("\n本次計(jì)算結(jié)果共有 %d 位,如下:\n\n",N-flag);
  112. for(p=flag;p<N-1;p++)
  113. {
  114. printf("%d",result[p]);
  115. if((p+1-flag)%(21*80) == 0)
  116. {
  117. printf("\n計(jì)算結(jié)果太長(zhǎng),請(qǐng)按任一鍵看下一屏,Esc 退出");
  118. if(getch() == 27)
  119. {
  120. clrscr(); exit(0);
  121. }
  122. clrscr();
  123. }
  124. }
  125. printf("%d",result[N-1]);
  126. printf("\n\n[OK]");
  127. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表