专栏首页图灵技术域求n!的位数以及求n!具体的值(C or C++)

求n!的位数以及求n!具体的值(C or C++)

首先我们先求n!位数 可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有 M =log10^n! 即: M = log10^1+log10^2+log10^3…+log10^n 循环求和,就能算得M值,该M是n!的精确位数。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n;
    int i;
    double d;
    while (cin>>n)
    {
        d=0;
        for (i=1;i<=n;i++)
        {
            d+=(double)log10(i);
        }
        cout<<(int)d+1<<endl;
 }
 return 0;
}

接下来,求n!的具体值 具体题目原型来自HDOJ :http://acm.hdu.edu.cn/showproblem.php?pid=1042

C++ Version:

#include <iostream>
#include <cstring>
/* 一个数组元素表示 4 个十进制位,即数组是万进制的 */
#define BIG_RADIX 10000
#define RADIX_LEN 4
/* 10000! 有 35660 位 */
#define MAX_LEN (35660/RADIX_LEN + 1)
using namespace std;
int x[MAX_LEN + 1];
void Big_Print()
{
    int start_output = 0;//用于跳过多余的0
    for (int i=MAX_LEN;i>= 0;--i)
    {
        if (start_output == 1){//如果多余的0已经跳过,则输出
            cout<<x[i];
        }
        else if (x[i] > 0){//表示多余的0已经跳过
            cout<<x[i];
            start_output = 1;
        }
    }
    if (start_output == 0)//如果全为0
        cout<<"0";
}
void Big_Multiple(int y)
{
    int carry = 0;//保存进位
    int tmp;
    for (int i=0;i<MAX_LEN;++i)
    {
        tmp = x[i] * y + carry;
        x[i] = tmp % BIG_RADIX;
        carry = tmp / BIG_RADIX;
    }
}
void Big_Factorial(int N)
{
    memset(x, 0, sizeof(x));
    x[0] = 1;
    for (int i=2; i<=N;++i){
        Big_Multiple(i);
    }
}
 
int main(void)
{
    int N;
    while (cin>>N)
    {
        Big_Factorial(N);
        Big_Print();
        cout<<endl;
    }
    return 0;
}

C Version:

#include <stdio.h>  
#include <string.h>  
 
/* 一个数组元素表示 4 个十进制位,即数组是万进制的 */  
#define BIG_RADIX 10000  
#define RADIX_LEN 4  
/* 10000! 有 35660 位 */  
#define MAX_LEN (35660/RADIX_LEN + 1)  
 
int x[MAX_LEN + 1];  
 
void Big_Print(){  
    int i;  
    int start_output = 0;//用于跳过多余的0  
 
    for (i = MAX_LEN; i >= 0; --i){  
        if (start_output == 1){//如果多余的0已经跳过,则输出  
            printf("%04d", x[i]);  
        }  
        else if (x[i] > 0){//表示多余的0已经跳过  
            printf("%d", x[i]);  
            start_output = 1;  
        }  
    }  
    if (start_output == 0)//如果全为0  
        printf("0");  
}  
 
void Big_Multiple(int y){  
    int i;  
    int carry = 0;//保存进位  
    int tmp;  
 
    for (i = 0; i < MAX_LEN; ++i){  
        tmp = x[i] * y + carry;  
        x[i] = tmp % BIG_RADIX;  
        carry = tmp / BIG_RADIX;  
    }  
}  
 
void Big_Factorial(int N){  
    int i;  
 
    memset(x, 0, sizeof(x));  
    x[0] = 1;  
    for (i = 2; i <= N; ++i){  
        Big_Multiple(i);  
    }  
}  
 
int main(void){  
    int N;  
 
    while (scanf("%d", &N) != EOF){  
        Big_Factorial(N);  
        Big_Print();  
        printf("\n");  
    }  
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pta 习题集 5-14 求n以内最大的k个素数以及它们的和

    本题要求计算并输出不超过n的最大的k个素数以及它们的和。 输入格式: 输入在一行中给出n(10≤≤n≤≤10000)和k(1≤≤k≤≤10)的值。 输出...

    ShenduCC
  • Sysbench 使用总结

    下载地址:https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz

    授客
  • GNU emacs Lisp小结3

    chapter4 与缓冲区有关的函数 4.1 查找更多的信息 C-h f 函数名   ;查询函数 C-h v 变量名   ;查询变量 find-tags 函数 ...

    py3study
  • 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1245  Solv...

    HansBug
  • tanh函数求导激活函数_tanh()函数以及C ++中的示例

    tanh() function is a library function of cmath header, it is used to find the hy...

    用户7886150
  • 一步一步学做测试工具(Spring Boot版)之三

    MC/DC(Modified Condition/Decision Coverage)是一种软件结构覆盖率测试准则, 通过最少N+1(N为Condition个数...

    周辰晨
  • CUDA PTX ISA阅读笔记(二)

    8. 第八章 指令集 这一章占了整个手册的一大半(百十来页吧),主要介绍各种指令,虽然页数很多,但是大多数指令都很简单。 8.1. 指令的形式和语义描述 这章就...

    用户1148523
  • Node.js为什么需要C++扩展?

    这些 C++扩展(xxx.node文件)也能像 JS 模块一样直接require使用,因为Node 模块加载机制提供了原生支持

    ayqy贾杰
  • <递归>汉诺塔 | 斐波那契数列 | 阶乘 (附python实现源码)汉诺塔问题求斐波那契数列背景故事:求阶乘

    经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世...

    zhaoolee
  • 机器学习算法实现解析——liblbfgs之L-BFGS算法

    1、liblbfgs简介 liblbfgs是L-BFGS算法的C语言实现,用于求解非线性优化问题。 liblbfgs的主页:http://www.chokkan...

    zhaozhiyong
  • 机器学习算法实现解析——liblbfgs之L-BFGS算法

    liblbfgs的主页:http://www.chokkan.org/software/liblbfgs/

    zhaozhiyong
  • pandas学习-索引-task13

    表的列索引 列索引是最常见的索引形式,一般通过 [] 来实现。通过 [列名] 可以从 DataFrame 中取出相应的列,返回值为 Series ,例如从表中取...

    用户7886150
  • linux下服务器并发测试

    引用自https://blog.csdn.net/u011415782/article/details/78501799

    kirin
  • 算法回顾--如何写递归?

    总之递归就是”装傻”的把原始的思路表现出来,不需要关心具体过程,只需要不停的缩小问题规模,然后答案自然就会被计算出来.

    屈定
  • 棋盘格检测--Automatic camera and range sensor calibration using a single shot

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148525
  • Leetcode【24、109、328、455、725】

    这道题是给一个链表,相邻结点数值两两进行交换,要求不修改结点值且只能操作链表本身。

    echobingo
  • PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第一讲,除数是2的幂

    除法,在汇编中是 DIV 指令 跟 IDIV指令,跟乘法一样.指令周期时间长.所以也必须进行优化. 但是除法的优化有很多原理.也就是很复杂. 逆向工作人员.也...

    IBinary
  • 图论--2-SAT--详解

    现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x]AND A[y]=0、A[x] OR A[y] OR A[z]=1等,要确定A[0..N-1]的...

    风骨散人Chiam
  • 干货|十分钟教你用动态规划算法解Travelling Salesman Problem(TSP)问题,附代码……

    乍一看标题,大家是不是觉得“动态规划”这四个字组合在一起有点眼熟?似乎哪会儿学过来着……但是吧,细细一琢磨,又忘了它具体是什么、怎么用、用来解决哪些问...

    用户1621951

扫码关注云+社区

领取腾讯云代金券