大数阶乘(N! Plus)问题
解题思路
将正整数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]);
}
}
}
个人主页:
大数阶乘(N! Plus)问题的更多相关文章
- nyist28大数阶乘
http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 我们 ...
- 大数阶乘(c语言)
大数阶乘.代码比较简单. #include<stdio.h> #include<string.h> #define MAXN 25000 // 如果你的阶乘N比较大,建议大一点 ...
- 【大数阶乘】NYOJ-28
大数阶乘 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数 ...
- 大数阶乘 nyoj
大数阶乘 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数 ...
- 【ACM】大数阶乘 - Java BigInteger实现
大数阶乘 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数 ...
- nyoj___大数阶乘
http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 我们都知 ...
- 大数阶乘(c++实现)
#include <iostream>using namespace std;#define N 1000int BigNumFactorial(int Num[], int n);voi ...
- HDU 1133 Buy the Ticket (数学、大数阶乘)
Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 大数阶乘(C/C++)
高精度的运算在Java中是很容易实现的,就像 a + b Problem 一样,因为Java提供了相应的类库和API:但是在 C/C++ 当中就没有那么现成的类和API来让你调用了.本着“自己动手,丰 ...
- #035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)
实际题目 本题要求实现一个打印非负整数阶乘的函数. 函数接口定义: void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000.如果N是非负 ...
随机推荐
- MYSQL常见安装错误集:[ERROR] --initialize specified but the data directory has files in it. Abort
1.[ERROR] --initialize specified but the data directory has files in it. Abort [错误] -初始化指定,但数据目录中有文件 ...
- Call to undefined method app\models\User::find() yii2-admin
这个问题可能大家遇到的不多. 分析原因 问题出在 config/web.php 这个配置文件里面 'components' => [ ..... 'user' => [ 'identity ...
- 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 nvarchar
.TrimEnd() 怀疑是否SqlBulkCopy是否存在某种bug,故而在系统中改写代码,用单个sql的插入数据方式,用循环逐条导入.结果是没问题.难道真的是SqlBulkCopy有某种bug?上 ...
- Jackson常用注解及用法
最近写项目,用到Jackson的一些注解,总结一下,帮助自己记忆. 1.@JsonIgnore 和 @JsonIgnoreProperties 两个注解可以对照比较后选择使用: @JsonIgnore ...
- ElasticSearch入门 —— 集群搭建
一.环境介绍与安装准备 1.环境说明 2台虚拟机,OS为ubuntu13.04,ip分别为xxx.xxx.xxx.140和xxx.xxx.xxx.145. 2.安装准备 ElasticSearch(简 ...
- ubuntu 安装企业级容器 docker harbor
安装docker harbor 企业级容器 环境说明: 操作系统: ubuntu16.04.5 LTS IP地址: 192.168.31.129 https://github.com/goh ...
- ant buid.xml 模板
<?xml version="1.0" encoding="UTF-8"?> <project name="ant" de ...
- pg_receivewal实践
测试从pg_receivewal的日志中恢复从库为主库: 主从配置async模式,配置pg_receivewal接收日志pg_receivewal -D /dbaas/pg/data/pg_recei ...
- java8----Predicate接口的使用
//5.lambda表达式中加入Predicate // 甚至可以用and().or()和xor()逻辑函数来合并Predicate, // 例如要找到所有以J开始,长度为四个字母的名字,你可以合并两 ...
- 关于this与e.target区别以及data-*属性
1 this与event.target 在编写事件函数时可以传入一个event参数,even参数可以使用一个target属性如even.target用以调用,其作用是指向返回事件的目标节点(触发该事件 ...