C语言试解PTA上基础题目集6-10 阶乘计算升级版

 

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

函数接口定义:

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;
}

 希望对大家有所帮助~

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值