close

 

 

題目:印出1N之間所有整數之階乘 (factorial)N£50

說明:

本題要求每一個N! 之值必須完全精確,不可以有誤差。換言之,資料儲存時,不可以使用浮點數 (floating point),只能使用整數(integer)

由於資料型態為整數 (integer),受到位元個數之限制 (可能為16 bits32 bits64bits),存放的最大數值受到限制。隨著N變大,N! 之值將無法放進單一整數變數中。例如32 bits整數,在無正負號的情形下,其最大值為232-1=4,294,967,295N>=13,而13!= 6,227,020,800以無法存入。故本題需使用整數的陣列 (array) 來存放資料,並模擬整數乘法與加法運算。例如,欲存放3264,以4個元素的陣列A來存放,結果如下:

3

2

6

4

此處,最右側的元素為陣列開頭元素A[0],則上面的資料代表:

      A[3]=3,  A[2]=2,  A[1]=6,  A[0]=4

 事實上,此處的每個元素均可存放一個大於或等於10的整數資料 (16 bits32 bits64bits)。但是,我們只存放一個整數的某個位數 (09)。若欲進行乘法運算,如3264*25,其計算過程如下:

 

0

0

3

2

6

4

*                         25

0

0

75

50

150

100

個位數進位至十位數:

0

0

75

50

160

0

十位數進位至百位數:

0

0

75

66

0

0

百位數進位至千位數:

0

0

81

6

0

0

千位數進位至萬位數:

0

8

1

6

0

0

 

輸入格式:

共有數組測試資料,每一組在一行輸入一個整數N之值,0£N£50。最後一組N之值為0,不必列印輸出資料,代表測試資料結束。

 

輸出格式:

對於每一個N,印出1N之間所有整數之階乘(共有N),每列印出一個階乘。所有印出的資料均需靠左置放。不同的N之間,以一個空白列隔開。

 

輸入範例:

6

10

0

 

輸出範例:

1!=1

2!=2

3!=6

4!=24

5!=120

6!=720

 

1!=1

2!=2

3!=6

4!=24

5!=120

6!=720

7!=5040

8!=40320

9!=362880

10!=3628800

 

 

 

C語言實作

// N_factorial.cpp: 定義主控台應用程式的進入點。
//

#include "stdafx.h"
#include "stdio.h"

void fact(int n);
int A[100];
int a = 0;
int main()
{
    int s=1;
    
    while (s != 0) {
        printf("please enter the number :");
        scanf_s("%d",&s);
        
        if (s != 0) {
            fact(s);
        }
        a = 0;
    }
    return 0;
}

void fact(int n)
{
    if (n == 1) {
        A[0] = 1;
        for (int i = 1; i < 100; i++) {
            A[i] = 0;
        }
        printf("1!=1\n");
    }
    else {
        fact(n - 1);
        for (int i = 0; i <= a; i++) {
            A[i] = A[i] * n;
        }
        
        for (int j = 0; j <= a; j++) {
            
            if (j == a) {
                if ((A[j] / 10) == 0) {
                a = a;
                }
                else if (0 < (A[j] / 10) < 10) {
                    a = a + 1;
                }
                
                else if (10 <= (A[j] / 10) < 100) {
                    a = a + 2;
                }
                else if (100 <= (A[j] / 10) < 1000) {
                    a = a + 3;
                }
                else if (1000 <= (A[j] / 10)< 10000) {
                    a = a + 4;
                }
                else if (10000 <= (A[j] / 10) < 100000) {
                    a = a + 5;
                }
                else { 
                    a = a; 
                }
            }
            
            A[j + 1] = A[j + 1] + A[j] / 10;
            A[j] = A[j] % 10;
        }
        
        printf("%d!=", n);
        
        for (int k = a; k >= 0; k--) {
            printf("%d", A[k]);
        }
        printf("\n");
        
    }
}

arrow
arrow
    全站熱搜

    異想人 發表在 痞客邦 留言(0) 人氣()