解题思路

将正整数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. kafka多线程消费

    建立kafka消费类ConsumerRunnable ,实现Runnable接口: import com.alibaba.fastjson.JSON; import com.alibaba.fastj ...

  2. div动画旋转效果

    animation: spin 10s linear infinite;

  3. Python学习之==>URL编码解码&if __name__ == '__main__'

    一.URL编码解码 url的编码解码需要用到标准模块urllib中的parse方法 from urllib import parse url = 'http://www.baidu.com?query ...

  4. Delphi下利用WinIo模拟鼠标键盘详解 有参考价值

    https://blog.csdn.net/fgrass_163/article/details/6365296 Delphi下利用WinIo模拟鼠标键盘详解 2011年04月26日 21:03:00 ...

  5. 【MyBatis】-----【MyBatis】---表级联系【一对一】--增删改查

    一.核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...

  6. mysql5.6修改密码并授权所有远程用户可登陆

    1.my.ini文件,删除最后一行的"skip-grant-tables 2.执行"use mysql;",使用mysql数据库; 3.执行:update mysql.u ...

  7. 【Linux开发】【Qt开发】交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别

    一. 什么是ABI和EABI1) ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)在计算机中,应用 ...

  8. Go语言入门篇-环境准备

    一.GO语言特点 静态类型:首先要明确变量类型,如上所示. 编译型:指GO语言要被编译成机器能识别机器代码. GO语言开源. 编程范式:支持“函数式”和“面向对象” GO语言原生的支持并发编程:即GO ...

  9. Java实验3与第五周总结

    1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) •统计该字符串中字母s出现的次数. •统计该字符串中子串" ...

  10. [转帖]22款让Kubernetes锦上添花的开源工具

    22款让Kubernetes锦上添花的开源工具 http://soft.zhiding.cn/software_zone/2019/0506/3117650.shtml 找时间尝试一下. 至顶网软件频 ...