求n!的位数以及求n!具体的值(C or C++)
来源:互联网 发布:苏州中国软件名城 编辑:程序博客网 时间:2024/06/05 06:27
首先我们先求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"); } }
Acknowledgements:
liushaobo:http://blog.csdn.net/jdplus/article/details/20376203
0 0
- 求n!的位数以及求n!具体的值(C or C++)
- 求N!的位数
- 求N!的位数
- 求N!的位数
- 求大数n!的位数
- PKU1423:求n!的位数。
- 求N!的位数(斯特林公式)
- hdu1018(求n!的位数)
- hdu1018(求n!的位数)
- 求N的阶乘的位数
- 求n的阶乘的位数
- LightOJ 1045 求N!的位数
- 湖北工业大学 1783 求n!的位数
- 【HDU1018】Big Number - 求n!的位数
- 求1-n位数的所有数
- 斯特林公式--求n!的位数
- 求N的阶乘C语言程序
- 求C(m,n)的大数模板
- java中list和arraylist的区别
- linux使用yum命令产生的进程锁问题
- 数组去重
- Hibernate通过Bean生成表的方法
- 编程技巧,数组覆盖
- 求n!的位数以及求n!具体的值(C or C++)
- 有向图强连通判断C/C++
- 排序算法c/c++
- python爬虫
- ext4_register_li_request
- Servlet的地址,跳转
- 查找元素出现的位置
- JSP内置对象(隐含对象)
- HDU2675