大数的运算--阶乘

今天复习了一下求阶乘

题目:编写一个程序,可以输出10000内的阶乘

#include <cstdio>
#include <cstdlib>
#include <cstring>
#define max_w 8002
#define base 100000

int ans[10002][max_w];
int wei[10002];

int calMulti(int n) {
    int ci = 0;
    for(int i = 0; i < wei[n-1]; i++) {
        int tmp = ans[n-1][i] * n + ci;
        ci = tmp / base;
        ans[n][i] = tmp % base;
    }
    wei[n] = wei[n-1];
    if(ci != 0) {
        ans[n][wei[n]] = ci;
        wei[n]++;
    }
}

int show(int n) {
    printf("%d",ans[n][wei[n]-1]);
    for(int i = wei[n]-2; i >= 0; i--) {
        printf("%05d",ans[n][i]);
    }

    puts("");
}

int main(int argc, char const *argv[])
{
    memset(ans, 0, sizeof(ans));
    memset(wei, 0, sizeof(wei));
    ans[0][0] = 1;
    ans[1][0] = 1;
    wei[0] = wei[1] = 1;
    for(int i = 2; i <= 10000; i++) {
        calMulti(i);
    }
    int n;
    while(scanf("%d",&n) != EOF) {
        show(n);
        printf("%d\n",wei[10000]);
    }
    return 0;
}

因为int的范围大致是9位,所以base的最大值是 1000000000/10000 = 100000,超过这个值就可能发生溢出的现象

10000的阶乘大致有4 * 10000 = 40000位,10000的阶乘不超过40000/5 = 8000位(事实上,有7132位)

时间: 2024-12-29 09:21:59

大数的运算--阶乘的相关文章

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

Acdream 1210 Chinese Girls&#39; Amusement(大数模板运算 + 找规律)

传送门 Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You must have heard that the Chinese culture is quite different from that of Europe or Rus

计算一个大数n的阶乘的位数宽度(十进制)转载

计算一个大数n的阶乘的位数宽度(十进制)(log i累加法 )转载 输入: 每行输入1个正整数n, (0<n<1000 000) 输出: 对于每个n,输出n!的(十进制)位数. 分析: 这道题采用蛮力法.根据定义,直接求解! 所谓n!的十进制位数,就是 log(n)+1, 根据数学公式有:n!=1*2*3*.....*n; lg(n!)=lg(2)+......lg(n); 代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

大数高精度运算(模板)

前言:高精度运算.是指參与运算的数(加数.减数,因子--)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算. 模板:包含大数加减乘除.大数与int数的乘法,模板能够不断扩充. 代码: /* 所有亲測可用,可是不能用于负数的运算,仅仅能对正数进行大数运算 */ const int ten[4]= {1,10,100,1000}; const int maxl = 300; struct BigNumber { int d[maxl]; char s[maxl]; BigNumber(co

大数各种运算

大数模板l #include<iostream> #include<cstring> #include<iomanip> #include<algorithm> #include<cstdio> using namespace std; #define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 struct BigNum { int a[500]; //可以控制大数的位数 int len; //大数长

大数的运算

C++中,int占用4字节,32比特,数据范围为-2147483648~2147483647[-2^31~2^31-1]. uint型为无符号32位整数,占4个字节,取值范围在0~4,294,967,295之间. 但是如果需要计算的数据比这个范围更大呢?使用long ,long long ?但是如果数据更大呢?如何进行大数的计算. 通常这个情况下我们会使用string来对数据进行运算.从而达到对这个庞大的数字进行操作. //模拟加法的运算 string add(string num1, stri

高精度运算-阶乘累积求和

# include <stdio.h> # include <math.h> # define N 66 int main(){ int s[N] = {0}, a[N] = {0};// s累加和,a累积求阶乘 int i,j,k,n,digit=1; //digit代表的是数字的位数 scanf("%d",&n); a[0]=1; s[0]=1; if(n==1)// 如果是1,阶乘和就是1,直接输出 printf("%d",s[

计算一个大数n的阶乘的位数宽度(十进制)(log i累加法 )

输入: 每行输入1个正整数n, (0<n<1000 000) 输出: 对于每个n,输出n!的(十进制)位数. 分析: 这道题采用蛮力法.根据定义,直接求解! 所谓n!的十进制位数,就是 log(n)+1, 根据数学公式有:n!=1*2*3*.....*n; lg(n!)=lg(2)+......lg(n); 代码: //输入一个数字n,请你计算该数的阶乘的十进制数的位数宽度 //比如:3!=6, 则宽度为1 //样例数据: //n=3 输出1 //n=32000 输出130271 //n=10

js如何实现大数的运算?

对于非常大或非常小的数,可以用科学记数法表示浮点值.采用科学记数法,可以把一个数表示为数字加e/E,后面加乘以10的倍数,如: var num1 = 3.125e7; // 31250000 var num2 = 3e-17; // 0.00000000000000003 进行特别大的数的加减运算,可以使用字符串+科学记数法的方法来进行,如: // 这里只考虑大整数的情况,不考虑小数 function strAdd(sNum1, sNum2){ /*增加一位数位以记录最高位进一的情况*/ var