解题思路

将正整数N从1到N逐位相乘,即1 * 2 * 3...... * (N-1) * N。每次相乘后的值会存储到array[]中,其中一个数组元素存储值中的一位数。当值小于10时直接存储,值大于10时,计算进位和本位,array[j]存储本位,array[j+1]存储进位。

如:10!= 3628800,有

array[7] = 3
array[6] = 6
array[5] = 2
array[4] = 8
array[3] = 8
array[2] = 0
array[1] = 0

样例输入

66

样例输出

544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000

代码实现

#include<stdio.h>
#define MAX 100000 // 若为10000,则会因缓存区过小而导致溢出 int main()
{
int numN = 0; // 正整数N
while (scanf("%d",&numN) != EOF)
{
if (numN < 1 || numN >= 10000)
{
break;
} int array[MAX] = {0};
array[1] = 1; // 从array[1]开始
int point = 1; // point表示位数,刚开始只有一位array[1] 且 array[1] = 1,不能为0,0乘任何数为0
int carry = 0; // carry表示进位数,刚开始进位为0
int j = 0; for (int i = 2; i <= numN; i++) // N的阶乘
{
for (j = 1; j <= point; j++) // 循环array[],让每一位都与i乘
{
int temp = array[j] * i + carry; // temp变量表示不考虑进位的值
carry = temp / 10; // 计算进位大小
array[j] = temp % 10; // 计算本位值
}
// 处理最后一位的进位情况
// 由于计算数组的最后一位也得考虑进位情况,所以用循环讨论
// 因为可能最后一位可以进多位;比如 12 * 本位数8,可以进两位
while(carry) // 当进位数存在时,循环的作用就是将一个数分割,分割的每一位放入数组中
{
array[j] = carry % 10;
carry = carry / 10;
j++; // 表示下一位
}
point = j - 1; // 由于上面while中循环有j++,所以位会多出一位,这里减去
} for (int i = point; i >= 1; i--) // 逆序打印结果
{
printf("%d", array[i]);
}
}
}

个人主页:

www.codeapes.cn

大数阶乘(N! Plus)问题的更多相关文章

  1. nyist28大数阶乘

    http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们 ...

  2. 大数阶乘(c语言)

    大数阶乘.代码比较简单. #include<stdio.h> #include<string.h> #define MAXN 25000 // 如果你的阶乘N比较大,建议大一点 ...

  3. 【大数阶乘】NYOJ-28

    大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

  4. 大数阶乘 nyoj

    大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

  5. 【ACM】大数阶乘 - Java BigInteger实现

    大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

  6. nyoj___大数阶乘

    http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知 ...

  7. 大数阶乘(c++实现)

    #include <iostream>using namespace std;#define N 1000int BigNumFactorial(int Num[], int n);voi ...

  8. HDU 1133 Buy the Ticket (数学、大数阶乘)

    Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. 大数阶乘(C/C++)

    高精度的运算在Java中是很容易实现的,就像 a + b Problem 一样,因为Java提供了相应的类库和API:但是在 C/C++ 当中就没有那么现成的类和API来让你调用了.本着“自己动手,丰 ...

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

    实际题目 本题要求实现一个打印非负整数阶乘的函数. 函数接口定义: void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000.如果N是非负 ...

随机推荐

  1. Spring MVC的RequestContextHolder使用误区

    JShop简介:jshop是一套使用Java语言开发的B2C网店系统,致力于为个人和中小企业提供免费.好用的网店系统. 项目主页:http://git.oschina.net/dinguangx/js ...

  2. Docker开启ssh服务

    一.准备 apt-get update       更新环境 apt-get install vim      安装vim vim  /etc/apt/source.list     更换软件源, 我 ...

  3. Mysql-使用xtrabackup添加Slave

    1.备份主库数据(主库操作) (1)安装innobackupex # yum -y install http://www.percona.com/downloads/percona-release/r ...

  4. Git入门资料

    1.廖雪峰老师Git教程 地址:https://www.liaoxuefeng.com/wiki/896043488029600 2.Eclipse eGit连接GitHub教程 地址:https:/ ...

  5. Java 多线程编程之:notify 和 wait 用法

    wait 和 notify 简介 wait 和 notify 均为 Object 的方法: Object.wait() —— 暂停一个线程 Object.notify() —— 唤醒一个线程 从以上的 ...

  6. windows上zeal安装和使用--离线API文档

    1.官网:https://zealdocs.org/download.html#windows 2.github:https://github.com/zealdocs/zeal 3.下载:可下载安装 ...

  7. Nginx 配置二级虚拟目录访问 Laravel 重写

    server { listen 80; server_name _; root /opt/sites; index index.php index.html index.htm; etag on; g ...

  8. linux-导入python自定义模块的使用方法

    #!/usr/bin/python # -*- coding:utf -8 -*- import os import sys sys.path.append("/h/s/compare_f& ...

  9. python 查询Neo4j多节点的多层关系

    需求:查询出满足3人及3案有关系的集合 # -*- coding: utf-8 -*- from py2neo import Graph import psycopg2 # 二维数组查找 def fi ...

  10. fpga为什么要用nios 开发

    同一个项目可以用NIOS2也可以不用就可以完成,这句话说对也可以说不对,这要看是一个什么样的项目,你那样问的话可就说明有CPU和没CPU下的使用情况你还没有搞清楚,这两者并没有完全分开,简单的说就是有 ...