每日训练(四)

简介: PTA的一道题:阶乘进阶

 阶乘计算升级版

 

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

函数接口定义:

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;
}
/* 你的代码将被嵌在这里 */

image.gif

输入样例:

15

image.gif

输出样例:

1307674368000

image.gif

解题思路:这里很明显是不能使用long long等长整型去做,因为已经超过long long的范围了,我们需要使用数组来存放结果。

思路是这样的:定义一个整型数组,然后将结果按位数从arr[0]按顺序存放。

比如:

2的阶乘:arr[0] = arr[0]*2+进位数,此时进位数为0,arr[0]存放的是2

3的阶乘:arr[0] = arr[0]*3+进位数,此时进位数为0,arr[0]存放的是6

4的阶乘:arr[0] = arr[0]*4+进位数,此时,结果是12,因此进位数是1,arr[0]存放的12%10 ==2,arr[1] = 1.

5的阶乘:arr[0] = arr[0]*5+进位数,,进位数为2,arr[0] = 0.arr[1]*5+进位数。此时arr[1] = 2,进位数是1,arr[3] = 1。所有结果是120。

E9ZDKR$5TI]5UMCCIB86~RH.png

void Print_Factorial ( const int N ) {
    if(N<0)
    {
        printf("Invalid input");
    }
    else{
            int arr[10000] = {0};
    arr[0] = 1;
    int carray = 0;//记录进位数
    int digitcapacity = 0;//用来记录位数
    int n = N;
     int j = 0,i = 0;
    for(i = 2;i<=n;i++)
    {
        for(j = 0;j<=digitcapacity;j++)
        {
            int tmp = arr[j]*i+carray;
            arr[j] = tmp%10;
            carray = tmp/10;
        }
        while(carray)
          {
              arr[j++] = carray%10;
               carray/=10;
                digitcapacity++;
            }
    }
    for(;digitcapacity>=0;digitcapacity--)//逆向打印
    {
        printf("%d",arr[digitcapacity]);
    }
 }
}

image.gif


相关文章
|
Java 测试技术 分布式数据库
从数据结构比较HBase的3种memstore实现方案
HBase的memstore目前存在3种实现:DefaultMemstore、CompactingMemstore、CCSMapMemStore,本文尝试从数据结构的角度对其进行比较。
1800 0
|
Ubuntu Linux
ubuntu 16.04 wifi无法连接+keneral 升级
ubuntu 16.04 wifi无法连接+keneral 升级
239 0
|
存储 关系型数据库 MySQL
centos7 安装mysql5.7
centos7 安装mysql5.7
452 0
|
应用服务中间件 Android开发
IntelliJ IDEA2017创建web工程并实现远程部署tomcat
IntelliJ IDEA2017创建web工程并实现远程部署tomcat
121 2
|
编译器 C++
c++ vector的使用
vector 的初始化
145 0
|
存储 缓存 安全
【操作系统】操作系统IO和虚拟文件系统VFS1
【操作系统】操作系统IO和虚拟文件系统VFS
【操作系统】操作系统IO和虚拟文件系统VFS1
|
网络协议 Linux 开发工具
kali arp-scan网络扫描工具 扫描局域网ip地址
作者主页:https://www.couragesteak.com/
kali arp-scan网络扫描工具 扫描局域网ip地址
|
前端开发
值得推荐!安利5款良心又好用的小众软件
电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。今天分享5个实用的软件,简单实用,效果拉满,堪称工作生活必备!
294 0
值得推荐!安利5款良心又好用的小众软件
|
Java API
Java注解与反射(三)
Java注解与反射(三)
187 0
|
存储 Java Spring
Java调用存储过程长时间未执行完问题-解决方案
Java调用存储过程长时间未执行完问题-解决方案