HDU1042(N!)题解

以防万一,题目原文和链接均附在文末。那么先是题目分析:

【一句话题意】

计算N的阶乘并输出。

【题目分析】

题给范围上限是10000,那么毫无疑问是大数题。之前我整理过各种大数的代码并且改了改然后所谓封装了一下,于是这道题就直接用了个类似的代码修改了一下,然后。。。交上去就对了(喂。。)。
但是作为题解,怎么着也得把做法解释清楚吧。。

以下为c语言代码(虽然是cpp提交的,也带了一堆cpp头文件),也附带了代码解释。代码很好懂,看看解释应该看得明白。还有...如果你是写java代码的。。现成的BigInteger再见慢走不送~

【算法流程】

大数乘小数:
  这里的小数指的是int范围内的小数。不管你知道不知道,我们假设你知道,大数应当用一个数组来存储,下标对应每一位的数字(下标和位数的关系可能会是或者说经常是相反的)。而大数运算则是相当于模拟小学的列式计算。那么,我们只需要按照小学那样,让大数的每一位和小数相乘,然后记录进位并加在下一位即可。
  为了方便计算,我们用int数组a存储大数,常整i存储小数(这个变量名称改改看着就舒坦了,这里不改是因为...因为....因为爱情XD),为了方便,我们采取下标从小到大对应个,十,百,千,万...的存数方式。为了方便管理位数和输出,我们另外使用一个变量digit存储管理大数现有位数。我们用变量j作为迭代器来扫位数进行模拟每一位的乘法,并用carry存储进位。(注:temp类型是int。)
于是,顺应上面的解释,我们有了这样的代码:

        for(carry = , j = ; j <= digit; ++j) {
temp = a[j - ] * i + carry;
a[j - ] = temp % ;
carry = temp / ;
}
while(carry) { //处理完毕仍需进位时,需要注意变动digit
a[++digit - ] = carry % ;
carry /= ;
}

我们可以这样测试上面的代码
  int a[455000] = {5,4,3,2,1};//初始化为12345,想改自己改= =
  digit = 5;//如上,五位
  i = n;//n为你要乘的数
自己封装个函数测试吧。。。。。。当然测试结果应该很科学。
修改代码:
  大数乘小数有了,那么我们循环从1乘到你要的数(最大1w)就是了。明显,我们需要:

  int a[] = {};//初始化为1
  digit = ;//1位(废话
  for(i = ; i <= n; i++) {
    //这里放大数乘小数的代码,i为小数,a数组为大数。n为要阶乘到的数
    //由于是循环,于是每次乘的结果就是大数*2*3*4*...*n了
  }

这下明白了吧。。
上代码。

 #include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> using namespace std; void echoFactorial(int n); int main() { int n;
while(scanf("%d",&n) != EOF) {
echoFactorial(n);
}
return ;
} void echoFactorial(int n){
int carry, j;
int digit;
int temp, i;
int a[] = {};//the express code of hometown
digit = ;
for(i = ; i <= n; i++) {
for(carry = , j = ; j <= digit; ++j) {
temp = a[j - ] * i + carry;
a[j - ] = temp % ;
carry = temp / ;
}
while(carry) {
a[++digit - ] = carry % ;
carry /= ;
}
} for(int k = digit; k >= ; --k)
printf("%d", a[k - ]);
printf("\n"); }
/*
TestData(IN)
1
2
3
TestData(OUT)
1
2
6
*/

这里是附带的题目信息:

题目链接:(HDU 1042)N!
题目属性:大数,模拟(竟然有说这道题要枚举的,醉,怎么可能。好吧你要枚举我一点也不介意~)
相关题目:1002、1042、1133、1250、1297、1715、1753、1865、2100
题目原文:
【Desc】Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
【In】One N in one line, process to the end of file.
【Out】For each N, output N! in one line.
【SampIn/Out】参见代码下方的注释。

HDU1042(N!)题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Windows下Vundle安装

    鼠标手老是发作,没办法.想学习vim尽量减少编码时使用鼠标的频率.安装好gVim开始安装Vundle插件,总结下安装过程和各种遇到的坑: github上VundleVim倒是有说明 Windows S ...

  2. [Effective Modern C++] Item 6. Use the explicitly typed initializer idiom when auto deduces undesired types - 当推断意外类型时使用显式的类型初始化语句

    条款6 当推断意外类型时使用显式的类型初始化语句 基础知识 当使用std::vector<bool>的时候,类型推断会出现问题: std::vector<bool> featu ...

  3. Android 上传库到Binary的操作

    第一次,按照网上教程配置需要的配置文件,上传成功 1.0版本. 以后更新的时候 输入 : install ,执行task 然后再输入:bintrayUpload ,执行task,看下面控制台输出信息, ...

  4. python运维开发(十二)----rabbitMQ、pymysql、SQLAlchemy

    内容目录: rabbitMQ python操作mysql,pymysql模块 Python ORM框架,SQLAchemy模块 Paramiko 其他with上下文切换 rabbitMQ Rabbit ...

  5. FTP配置参数

    格式 vsftpd.conf 的格式非常简单,每行要么是一个注释,要么是一个指令.注释行以#开始并被忽略掉.指令行格式如下: 配置项=参数值 很重要的一点是,这个格式里不存在任何空格. 默认的,每一个 ...

  6. 自学nodejs系列

    好久没有搞nodejs了.nodejs也是更新的很快!!当初翻译的文档

  7. thinkphp中的where()方法

    where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...

  8. Virtualbox下实现Ubuntu虚拟机和win7主机文件共享(很简单,亲自试用,按此步骤一般都会成功)

    最近做一个操作系统实验,第一个实验即是实现Ubantu虚拟机与主机之间的共享. 本例用的是VirtualBox虚拟机,若使用Vmware WorkStation虚拟机则方法与下文介绍略有不同,但基本相 ...

  9. poj 1907 Work Reduction_贪心

    题意:公司要你要完成N份任务,但是你是不可能全部完成的,所以需要雇佣别人来做,做到剩下M份时,自己再亲自出马.现在有个机构,有两种付费方式,第一种是每付A元帮你完成1份,第二种是每付B元帮你完成剩下任 ...

  10. OpenSuSE查看指定软件包是否安装(OpenSuSE使用RPM作为默认的软件包维护管理工具)

    suse 是 zypper se xxxxx 是搜索软件包 (查看已经安装的 软件包是否已经安装)