c语言阶乘计算升级版,#035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)

实际题目

本题要求实现一个打印非负整数阶乘的函数。

函数接口定义:

void Print_Factorial ( const int N );

其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。

裁判测试程序样例:

#include

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 intN ){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; //表示数据的位数。

17

18 i=0, k=0;19 while(t) //把数字按位数传入数组

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; //表示进位

29 for (i=0; i

32 a[i] = t%10;33 w = t/10;34 }35

36 while(w) //需要进位了

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 }

知识点分析

求阶乘,数过大,使用了数组进行存储

例子中1000阶乘大约2500位,所以使用数组a[3000]

建立一个计算的函数

int fanc(int n)

{

int w=0;

int i=0, j=0;

int t=n;

int k=0; // 表示数据的位数。

i=0, k=0;

while(t)//把数字按位数传入数组

{

a[i++] = t%10;

t/=10;

k++;

}

for (j=n-1; j>1; j--)//开始阶乘

{

w=0; // 表示进位

for (i=0; i

{

t = a[i]*j+w; //每个位数乘乘数因子+是否进位

a[i] = t%10;

w = t/10;

}

while(w)//需要进位了

{

a[i++] = w%10;

w/=10;

k++;

}

}

return k;

}

建立一个打印的函数

个位存在数组第一个位置,十位存在第二个,以此类推,

所以输出的时候要反向输出。

123是按照 3 2 1存储的

void show(int k)

{

int i=0;

printf("位数 %d 位\n",k);

for (i=k-1; i>=0; i--)

{

printf("%d",a[i]);

}

}

引用博客

链接:

引用代码

1 //1000 的阶乘 2568 位

2 #include

3

4 int a[3000];5

6 void show(intk)7 {8 int i=0;9 printf("位数 %d 位\n",k);10 for (i=k-1; i>=0; i--)11 {12 printf("%d",a[i]);13 }14 }15

16 int fanc(intn)17 {18 int w=0;19 int i=0, j=0;20 int t=n;21 int k=0; //表示数据的位数。

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; //表示进位

34 for (i=0; i

41 while(w)42 {43 a[i++] = w%10;44 w/=10;45 k++;46 }47 }48 returnk;49 }50

51

52 intmain()53 {54 intn;55 int k=0;56

57 scanf("%d",&n);58 k =fanc(n);59 show(k);60 printf("\n");61 return 0;62 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值