大数运算:HDU-1042-N!(附N!位数的计算)
解题心得:
- 这里使用了10000进制。很明显,因为是n!所以单个最大的数是10000*10000,使用万进制。
- 可以借鉴高精度的加法,单个乘了之后在进位。
- 很坑的一点,0!=1,数学不好WA了三次,尴尬。
10000!有35660位数,求解方法如下
方法一:
可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有 M =log10^n!
即:
M = log10^1+log10^2+log10^3…+log10^n
循环求和,就能算得M值,该M是n!的精确位数。方法二:
利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
res=(long)( (log10(sqrt(4.0*acos(0.0)n)) + n(log10(n)-log10(exp(1.0)))) + 1 );
当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况 !
有关斯特林(Stirling)公式及其相关推导,这里就不进行详细描述,
这种方法速度很快就可以得到结果。
题目:
N!
Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1
2
3
Sample Output
1
2
6
Author
JGShining(极光炫影)
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int maxsize = 35660;//10000!有35660位
const int big_radix = 10000;//使用的是万进制
int num[maxsize+1];
void big_g(int n1)
{
int carry = 0;
int temp;
for(int i=0;i<maxsize;i++)//核心
{
temp = num[i] * n1 + carry;
num[i] = temp % big_radix;
carry = temp / big_radix;
}
}
void bit_prin()
{
bool flag = false;//用于判断第一个是否为零,是零则跳过
for(int i=maxsize;i>=0;i--)
{
if(flag)
{
printf("%04d",num[i]);
}
else if(num[i] > 0)
{
flag = true;
printf("%d",num[i]);
}
}
if(!flag)//全是零打印0
printf("0");
printf("\n");
return ;
}
int main()
{
int n;
while(cin>>n)
{
memset(num,0,sizeof(num));//全换位零方便之后的判断
num[0] = 1;//初始化第一个,0!=1;
for(int i=2;i<=n;i++)
{
big_g(i);
}
bit_prin();
}
return 0;
}
大数运算:HDU-1042-N!(附N!位数的计算)的更多相关文章
- HDU 1042 大数阶乘
B - 2 Time Limit:5000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- HDU 1042 N! 參考代码
HDU 1042 N! 题意:给定整数N(0 ≤ N ≤ 10000), 求 N! (题目链接) #include <iostream> using namespace std; //每一 ...
- 大数运算的算法设计和C++实现
1.背景 工作中遇到过需要进行极大数据的存储和运算的场景,当时使用Python解决了这个问题,在Python中,整数没有位数限制,使用起来很方便.但是当程序主体使用C/C++实现时,就比较麻烦.所以考 ...
- java 大数运算[转]
用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...
- 大数运算(python2)
偶然又遇到了一道大数题,据说python大数运算好屌,试了一发,果然方便-1 a = int( raw_input() ); //注意这里是按行读入的,即每行只读一个数 b = int( raw_in ...
- 收藏的一段关于java大数运算的代码
收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...
- [PKU2389]Bull Math (大数运算)
Description Bulls are so much better at math than the cows. They can multiply huge integers together ...
- A+B大数运算
基础加法大数运算: [https://vjudge.net/problem/HDU-1002] 题目: 输入两个长度不超过1000的整数求出sum. 思路: 由于数字很大不能直接加,用字符串形式输入, ...
- HOJ 2148&POJ 2680(DP递推,加大数运算)
Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...
- 九度OJ 1198:a+b (大数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6745 解决:2320 题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位 ...
随机推荐
- C#面试常见题
1. 简述 private. protected. public. internal 修饰符的访问权限. 答: private : 私有成员, 在类的内部才可以访问. protected : 保护成员 ...
- 斗鱼扩展初识Chrome扩展(一)
看斗鱼有些时间了,也写了不少辅助的js,但是昨天不小心把硬盘分区表搞没了,自己写了好久的代码不见了,DiskGenius 也没恢复成功,所以要重写一次,大家要引以为鉴,常备份代码,github是个不错 ...
- ps使用
1.图片剪裁 1.按快捷键M(矩形选择工具)-> 选中要扣出的图片(按shift可正方形)->按快捷键C(剪裁工具)->双击鼠标选中区域,剪裁成功. 2.选中psd中的图标 1.按快 ...
- ORACLE 数据库的级联查询 一句sql搞定(部门多级)
在ORACLE 数据库中有一种方法可以实现级联查询 select * //要查询的字段 from table //具有子接点ID与父接点I ...
- 零基础逆向工程29_Win32_03_ESP寻址_定位回调函数_子窗口_消息处理函数
1 Win32应用程序入口识别 思路:根据WinMain的四个参数,由调用顺序,知道最后压栈的是hInstance句柄(也就是WinMain函数的第一个参数,其值等于ImageBase),根据反汇编, ...
- Android仿微信高效压缩图片(libjpeg)
用过ios手机的同学应该很明显感觉到,ios拍照1M的图片要比安卓拍照排出来的5M的图片还要清晰.这是为什么呢? 这得了解android底层是如何对图片进行处理的. 当时谷歌开发Android的时候, ...
- 美国绿卡基础知识:I-539和I-129表格的应用回复新帖
美国绿卡基础知识:I-539和I-129表格的应用 发布于: 2011/07/25 8:43 am 引用 I-539,就是和万金油类似的表格.不管你是要延期,还是转换身份:不管你是 B-2 ...
- JavaScript_HTML DEMO_2_事件
如需在用户点击某个元素时执行代码,请向一个HTML事件属性添加JavaScript代码 OnClick=JavaScriptcript 对事件做出反应 HTML事件属性 使用HTML DOM来分配事 ...
- JavaScript getMonth() 方法
应该特别注意的是Js中getMonth()这个方法的返回值: 定义和用法: getMonth() 方法可返回表示月份的数字. 返回值: dateObject 的月份字段,使用本地时间.返回值是 0(一 ...
- SAP云平台CloudFoundry中的用户自定义变量
CloudFoundry应用的manifest.xml里的env区域,允许用户自定义变量,如下图5个变量所示. 使用cf push部署到CloudFoundry之后,在SAP Cloud Platfo ...