本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N
是用户传入的参数,其值不超过1000。如果N
是非负整数,则该函数必须在一行中打印出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
输入样例:
1000
输出样例:
4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442084
8696940480047998861019719605863166687299480855890132382966994459099742450408707375991882362
7727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119
1810458257836478499770124766328898359557354325131853239584630755574091142624174743493475534
2864657661166779739666882029120737914385371958824980812686783837455973174613608537953452422
1586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025
4785893207671691324484262361314125087802080002616831510273418279777047846358681701643650241
5369139828126481021309276124489635992870511496497541990934222156683257208082133318611681155
3615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487
9849599533191017233555566021394503997362807501378376153071277619268490343526252000158885351
4733161170210396817592151090778801939317811419454525722386554146106289218796022383897147608
8506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911
9037540312746222899880051954444142820121873617459926429565817466283029555702990243241531816
1721046583203678690611726015878352075151628422554026517048330422614397428693306169089796848
2590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043
3676601769996128318607883861502794659551311565520360939881806121385586003014356945272242063
4463179746059468257310379008402443243846565724501440282188525247093519062092902313649327349
7565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900
1407673104466402598994902222217659043399018860185665264850617997023561938970178600408118897
2991831102117122984590164192106888438712185564612496079872290851929681937238864261483965738
2291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051
3996942901534830776445690990731524332782882698646027898643211390835062170950025973898635542
7719674282224875758676575234422020757363056949882508796892816275384886339690995982628095612
1450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254
7421735824010636774045957417851608292301353580818400969963725242305608559037006242712434169
0900415369010593398383577793941097002775347200000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000
使用C语言解答如下:
#include <stdio.h>
void Print_Factorial(const int N);
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
#define MAXN 3000
void Print_Factorial(const int N)//本题情况特殊,1000!巨大,C语言中无可容纳的数据类型
{
int result[3333] = { 0 }, i, j;//定义数组,1000!至少需要2657位
if (N < 0)
{
printf("Invalid input");
return;
}
else if (N == 0 || N == 1)//特殊值直接输出
{
printf("1");
return;
}
result[0] = 1;//关键,不可省略
for (i = 2; N >= i; i++)
{
for (j = 0; j < MAXN; j++)
{
result[j] *= i;//每个元素都对应乘上相应的阶乘项
}
for (j = 0; j < MAXN; j++)//开始作进位处理
{
if (result[j] >= 10)//某位大于10,突破10进制
{
result[j + 1] += (result[j] / 10);//其后一位进位
result[j] %= 10;//本位取余
}
}
}
i = MAXN;
while (result[i] == 0)
i--;//从高位往低位输出,确定最高位的位置
for (; i >= 0; i--)
printf("%d", result[i]);//输出
return;
}
希望对大家有所帮助~