題目:印出1到N之間所有整數之階乘 (factorial),N£50。
說明:
本題要求每一個N! 之值必須完全精確,不可以有誤差。換言之,資料儲存時,不可以使用浮點數 (floating point),只能使用整數(integer)。
由於資料型態為整數 (integer),受到位元個數之限制 (可能為16 bits、32 bits或64bits),存放的最大數值受到限制。隨著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 bits、32 bits或64bits)。但是,我們只存放一個整數的某個位數 (即0至9)。若欲進行乘法運算,如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,印出1到N之間所有整數之階乘(共有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");
}
}