Hdu 1042 N! (高精度数)

Problem Description

Givenan integer N(0 ≤ N ≤ 10000), your task is to calculate N!

Input

OneN in one line, process to the end of file.

Output

Foreach N, output N! in one line.

Sample Input

1

2

3

Sample Output

1

2

6

Author

JGShining(极光炫影)

/*********

高精度数,大数阶乘

类比十进制,模拟一个万进制的算法算法,参考:http://blog.csdn.net/lulipeng_cpp/article/details/7437641

用int 存数位,10000*100000<2^31,所以我每一位存了 100000,当然与 10000是类似的

*********/

Code:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
/**
计算阶乘位数,顺便把POJ 1423 给A了
#define PI 3.141592653589793239
#define ee 2.7182818284590452354
int ans(int n){
    return (int)((n*log10(n/ee)+log10(sqrt(2*n*PI))))+1;
}

*/
int num[8000];
int main()
{
    int n,i,j;
    while(cin>>n)
    {
        memset(num,0,sizeof(num));
        num[0] = 1;
        for(i = 2;i<=n;i++)
        {
            for(j = 0;j<8000;j++)
                num[j]*=i;
            for(j = 0;j<8000;j++)
            {
                num[j+1] += num[j]/100000;
                num[j] %= 100000;
            }
        }
        int len = 8000;
        while(num[len] == 0)
        {
            len--;
        }
        cout<<num[len];
        for(i = len-1;i>=0;i--)
        {
            printf("%.5d",num[i]);
        }
        printf("\n");
    }
    return 0;

}
时间: 2024-11-05 15:59:03

Hdu 1042 N! (高精度数)的相关文章

HDU 1042 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 题目意思很简单,就是让你求N的阶乘,但是N的范围有10000,所

hdu 1250 Hat&#39;s Fibonacci(高精度数)

//  继续大数,哎.. Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1. F(1) = 1, F(2) = 1, F(3) = 1,F(4) = 1, F(n>4) = F(n - 1) + F(n-2) + F(n-3) + F(n-4) Your tas

hdu 1063 Exponentiation (高精度小数乘法)

//大数继续,额,要吐了. Problem Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems. This problem re

hdu 1565 方格取数(2)(网络流之最大点权独立集)

题目链接:hdu 1565 方格取数(2) 题意: 有一个n*m的方格,每个方格有一个数,现在让你选一些数.使得和最大. 选的数不能有相邻的. 题解: 我们知道对于普通二分图来说,最大独立点集 + 最小点覆盖集 = 总点数,类似的,对于有权的二分图来说,有: 最大点权独立集 + 最小点权覆盖集 = 总点权和, 这个题很明显是要求 最大点权独立集 ,现在 总点权 已知,我们只要求出来 最小点权覆盖集 就好了,我们可以这样建图, 1,对矩阵中的点进行黑白着色(相邻的点颜色不同),从源点向黑色的点连一

【网络流】hdu 1569 方格取数(2)

/* 和1565一样: 总点数的权 - 最小覆盖点集 = 最大独立集 -------------------------------------- void add(int u, int v, int f)加边 { e[ct].u = u; e[ct].v = v; e[ct].f = f; next[ct] = first[u]; first[u] = ct++; e[ct].u = v; e[ct].v = u; e[ct].f = 0; next[ct] = first[v]; first

hdu 1999 不可摸数 水题。

不可摸数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7966    Accepted Submission(s): 2024 Problem Description s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,则称n为不可摸数. Input 包

网络流 [HDU 1565] 方格取数(1)

方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5961    Accepted Submission(s): 2268 Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数

hdu 1565 方格取数(1)

这个题网上很多人都说用状态压缩dp来做,我就是觉得状态压缩dp有点那么理解不上啊,不过如果这个题吧相邻的两个格子连起来,那不就是求最大权独立点集吗?奋战了三天,我的第一道最大流题目终于写出来了,高兴啊! #include<map> #include<set> #include<stack> #include<queue> #include<cmath> #include<vector> #include<cstdio> #

HDU 1565 方格取数(1) (状态压缩DP)

HDU 1565 方格取数(1) (状态压缩DP) ACM 题目地址: HDU 1565 方格取数(1) 题意: 中文. 分析: dp[i][j]表示前i行状态j的最优解. 先预处理出符合条件的数,17000+个(n在20以内). 不过感觉复杂度挺高的会T,但是却能A. 这题的正解应该是最小割,回头补下. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: 1565_dp.cpp * Create Date: 2014-09-19 23