#035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)
實(shí)際題目
本題要求實(shí)現(xiàn)一個(gè)打印非負(fù)整數(shù)階乘的函數(shù)。
函數(shù)接口定義:
void Print_Factorial ( const int N );其中N是用戶傳入的參數(shù),其值不超過1000。如果N是非負(fù)整數(shù),則該函數(shù)必須在一行中打印出N!的值,否則打印“Invalid input”。
裁判測試程序樣例:
#include <stdio.h>void Print_Factorial ( const int N );int main() {int N;scanf("%d", &N);Print_Factorial(N);return 0; }/* 你的代碼將被嵌在這里 */輸入樣例:
15輸出樣例:
1307674368000通過代碼
1 void Print_Factorial ( const int N ){ 2 int a[3000]; 3 int n=N; 4 if(n<0||n>1000){ 5 printf("Invalid input"); 6 return 0; 7 } 8 if(n==0){ 9 printf("1"); 10 return 0; 11 } 12 else{ 13 int w=0; 14 int i=0, j=0; 15 int t=n; 16 int k=0; // 表示數(shù)據(jù)的位數(shù)。 17 18 i=0, k=0; 19 while(t) //把數(shù)字按位數(shù)傳入數(shù)組 20 { 21 a[i++] = t%10; 22 t/=10; 23 k++; 24 } 25 26 for (j=n-1; j>1; j--) //開始階乘 27 { 28 w=0; // 表示進(jìn)位 29 for (i=0; i<k; i++) 30 { 31 t = a[i]*j+w; //每個(gè)位數(shù)乘乘數(shù)因子+是否進(jìn)位 32 a[i] = t%10; 33 w = t/10; 34 } 35 36 while(w) //需要進(jìn)位了 37 { 38 a[i++] = w%10; 39 w/=10; 40 k++; 41 } 42 } 43 int ttt=0; 44 int ii=0; 45 46 for (ii=k-1; ii>=0; ii--) 47 { 48 printf("%d",a[ii]); 49 } 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 } 66 return 0; 67 68 }知識點(diǎn)分析
求階乘,數(shù)過大,使用了數(shù)組進(jìn)行存儲
例子中1000階乘大約2500位,所以使用數(shù)組a[3000]
建立一個(gè)計(jì)算的函數(shù)
int fanc(int n)
{
int w=0;
int i=0, j=0;
int t=n;
int k=0; // 表示數(shù)據(jù)的位數(shù)。
i=0, k=0;
while(t) //把數(shù)字按位數(shù)傳入數(shù)組
{
a[i++] = t%10;
t/=10;
k++;
}
for (j=n-1; j>1; j--) //開始階乘
{
w=0; // 表示進(jìn)位
for (i=0; i<k; i++)
{
t = a[i]*j+w; //每個(gè)位數(shù)乘乘數(shù)因子+是否進(jìn)位
a[i] = t%10;
w = t/10;
}
while(w) //需要進(jìn)位了
{
a[i++] = w%10;
w/=10;
k++;
}
}
return k;
}
建立一個(gè)打印的函數(shù)
個(gè)位存在數(shù)組第一個(gè)位置,十位存在第二個(gè),以此類推,
所以輸出的時(shí)候要反向輸出。
123是按照 3 2 1存儲的
?
void show(int k)
{
int i=0;
printf("位數(shù) %d 位\n",k);
for (i=k-1; i>=0; i--)
{
printf("%d",a[i]);
}
}
?
引用博客
鏈接:
大數(shù)運(yùn)算_求1000的階乘(C語言實(shí)現(xiàn))
引用代碼
1 // 1000 的階乘 2568 位 2 #include <stdio.h> 3 4 int a[3000]; 5 6 void show(int k) 7 { 8 int i=0; 9 printf("位數(shù) %d 位\n",k); 10 for (i=k-1; i>=0; i--) 11 { 12 printf("%d",a[i]); 13 } 14 } 15 16 int fanc(int n) 17 { 18 int w=0; 19 int i=0, j=0; 20 int t=n; 21 int k=0; // 表示數(shù)據(jù)的位數(shù)。 22 23 i=0, k=0; 24 while(t) 25 { 26 a[i++] = t%10; 27 t/=10; 28 k++; 29 } 30 31 for (j=n-1; j>1; j--) 32 { 33 w=0; // 表示進(jìn)位 34 for (i=0; i<k; i++) 35 { 36 t = a[i]*j+w; 37 a[i] = t%10; 38 w = t/10; 39 } 40 41 while(w) 42 { 43 a[i++] = w%10; 44 w/=10; 45 k++; 46 } 47 } 48 return k; 49 } 50 51 52 int main() 53 { 54 int n; 55 int k=0; 56 57 scanf("%d",&n); 58 k = fanc(n); 59 show(k); 60 printf("\n"); 61 return 0; 62 }?
轉(zhuǎn)載于:https://www.cnblogs.com/hx97/p/10789237.html
總結(jié)
以上是生活随笔為你收集整理的#035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python条件表达式:多项分支,双向分
- 下一篇: Java逻辑运算