首先我们先求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;//用于跳过多余的0for (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)//如果全为0cout<<"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");  }
} 

Acknowledgements:
liushaobo:http://blog.csdn.net/jdplus/article/details/20376203

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

  1. 【c语言】输入一个4位数,求四位数中各位数相加之和

    <程序设计基础实训指导教程-c语言>杨莉 龚义建 科学出版社 ISBN 978-7-03-032846-5 p9 2.1.2 上机实训内容 [实训内容1] 编程实现:输入一个4位数,求4位 ...

  2. C++中如何读取一个数的位数_求1000以内的水仙花数

    点击上方 蓝字关注我们 大家好,我是阿汤哥. 看知乎上有朋友说还不明白怎么判断水仙花数,今天我们就来看看这个问题.(PS:"求1000以内的水仙花数"这道题阿汤哥记忆犹新.到现在还 ...

  3. 采用递归求第n位数【C#】

    题目描述 一数列的规则如下:1.1.2.3.5.8.13.21.34.......求第n位数是多少? 输入 输入一个正整数,代表求第几位数字 输出 输出第n位数字 样例输入 30 样例输出 83204 ...

  4. 求整数的位数及各位数字之和(C语言)

    对于给定的正整数N,求它的位数及其各位数字之和. 输入格式: 输入在一行中给出一个不超过10^9​的正整数N. 输出格式: 在一行中输出N的位数及其各位数字之和,中间用一个空格隔开. 输入样例: 32 ...

  5. 求整数的位数及各位数字之和 (15 分)

    7-48 求整数的位数及各位数字之和 (15 分) 对于给定的正整数N,求它的位数及其各位数字之和. 输入格式: 输入在一行中给出一个不超过109的正整数N. 输出格式: 在一行中输出N的位数及其各位 ...

  6. 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。

    已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位 ...

  7. 编制一个函数jsValue(),求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数的平均值pjz1,以及不满足此条件的四位数的平均值pzj2

    已知数据文件IN15.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数 ...

  8. 实验4-1-4 求整数的位数及各位数字之和 (15 分)

    实验4-1-4 求整数的位数及各位数字之和 (15 分) 对于给定的正整数N,求它的位数及其各位数字之和. 输入格式: 输入在一行中给出一个不超过109的正整数N. 输出格式: 在一行中输出N的位数及 ...

  9. c语言 正整数 几位 逆序,c语言经典例题:正整数求位数and求顺、逆序位数

    经典例题:正整数求位数and求顺.逆序位数 题目要求: 给出一个int整形正整数,要求: 1.求出它是几位数字 2.按照逆序分别输出每位数字,例如123输出为321 3.按正序输出每位数字 分析: 一 ...

  10. 实验4-1-4 求整数的位数及各位数字之和 (15分)(想象成剥洋葱)

    对于给定的正整数N,求它的位数及其各位数字之和. 输入格式: 输入在一行中给出一个不超过10​9​​的正整数N. 输出格式: 在一行中输出N的位数及其各位数字之和,中间用一个空格隔开. 输入样例: 3 ...

最新文章

  1. 「NLP」ALBERT:更轻更快的NLP预训练模型
  2. 遍历替换字符串中特定字符
  3. 设计一条简单的等待工作队列之软件模型设计与实现(二)
  4. “基础数学没用”,百年名校要裁撤数学系补贴AI研究,4000多学者联合抗议
  5. Glusterfs 分布式存储安装部署
  6. cpio用法详细说明
  7. 面试python开发_python开发面试问题
  8. python3月新增知识点
  9. php后台富文本编辑器的内容调用到前端小程序页面的一些显示问题,如:nbsp;
  10. J - Just Multiplicative Inverse Gym - 102875J
  11. 3分钟学会SVN:SVN快速上手
  12. 关于错误:不能将licenses.licx文件转换成二进制,error lc0003 !
  13. WINDOWS 一键host地址绑定
  14. 3806. 最小化字符串-AcWing题库
  15. Codeforces Round #574 (Div. 2)
  16. 机器码、序列号、认证码、注册码的生成算法(五)
  17. ReResNet源码解读
  18. PROFINET转EtherNet/IP网关连接罗克韦尔(AB) PLC配置案例
  19. MATLAB Jacobi迭代法 求解线性方程组
  20. 解析迅捷产品的八大特点

热门文章

  1. 什么软件可以让头发变黑_头发特别干枯毛躁,请问什么方法可以让头发恢复到顺滑状态?...
  2. html中rowspan设置动态值_大众标准里机器人程序中P值的设置存在那里?
  3. 哪个oracle工具可以免费,Sqlite导入Oracle工具下载官方免费版_SqliteToOracle2.2英文版 - 系统之家...
  4. java线程池服务ExecutorService
  5. java文件中注释出现乱码解决办法
  6. 腐蚀单机服务器怎么不稳定,腐蚀有什么指令?基本指令及服务器指令汇总
  7. mongodb 扩展 libmongoc ssl_扩展面板
  8. yarn:info There appears to be trouble with your network connection. Retrying...
  9. 01. Django基础:Django介绍
  10. JetBrains:webstrom无法识别就require方法