- #define M 20000 /* 最大結果位數(shù),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("輸入計算其階乘的數(shù):Num = ");
- scanf("%d",&Num);
- if(Num >= 100)
- {
- printf("\n正在進行階乘運算. . .\n");
- printf("已完成 00000 的階乘,請等待. . .");
- }
- for (j=0;j<N;j++)
- {
- result_1[j] = 0; result_0[j] = 0;
- }
- result_1[N-1] = 1;
- for(i=0;i<5;i++)
- {
- str_n[i] = 0;
- }
- n = 1;
- pc = 0; flag = N-1;
- while (n <= Num)
- {
- m = n;
- k = 4;
- while(m > 0)
- {
- str_n[k] = m%10; m /= 10; k--;
- }
- 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 標記相乘后“可能的”第一個有效數(shù)字的標號 */
- if(pc%2 == 0) /* 再處理一次使 flag 正好標記第一個有效數(shù)字的標號 */
- {
- 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) /* 相乘函數(shù) */
- {
- register int i,j;
- for(j=flag;j<N;j++) c[j]=0;
- for(i=4;i>=0;i--)
- {
- if(a)
- {
- for (j=N-1;j>=flag;j--)
- {
- 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]/10; c[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) /* 輸出結果函數(shù) */
- {
- int p;
- printf("\n本次計算結果共有 %d 位,如下:\n\n",N-flag);
- for(p=flag;p<N-1;p++)
- {
- 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]");
- }
復制代碼
|