求一个数阶乘的位数
2015-09-10 10:39
260 查看
Big Number
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6291 Accepted Submission(s): 2836
问题描述:
在许多应用中需要非常大的整数。一些应用程序是使用密钥、加密等进行安全传输的数据。在这个问题上,你给出了一个数字,必须确定的数字的数目。
输入:
输入由若干行组成。第一行包含一个整数n,要检验的大整数的数目,表示共有n行,每行一个整数(1≤N≤10^7)。
输出:
输出结果是输入中出现的整数的位数。
Sample Input
2
10
20
Sample Output
7
19
代码如下:
这是最简单的方法,但是耗时长,406ms。
好吧!我们换个方法:
这需要组合数学的知识。log10(n!) = log10(sqrt(2 * pi * n)) + n * log10(n / e)
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6291 Accepted Submission(s): 2836
问题描述:
在许多应用中需要非常大的整数。一些应用程序是使用密钥、加密等进行安全传输的数据。在这个问题上,你给出了一个数字,必须确定的数字的数目。
输入:
输入由若干行组成。第一行包含一个整数n,要检验的大整数的数目,表示共有n行,每行一个整数(1≤N≤10^7)。
输出:
输出结果是输入中出现的整数的位数。
Sample Input
2
10
20
Sample Output
7
19
代码如下:
#include <stdio.h> #include <math.h> void main() { int count,var,j; double sum; scanf("%d",&count); while(count--) { sum=0; scanf("%d",&var); for(j=1;j<=var;j++) sum+=log10(j); printf("%d/n",(int)sum+1); } }
这是最简单的方法,但是耗时长,406ms。
好吧!我们换个方法:
这需要组合数学的知识。log10(n!) = log10(sqrt(2 * pi * n)) + n * log10(n / e)
////Problem ID: 1018 ////Problem Title: ////Run result: Accept ////Run time:0MS ////Run memory:332KB //////////////////System Comment End////////////////// #include <iostream> #include <cmath> #define PI 3.14159265 int n; int num,ans; void solve() { double t; int i; // log10(n!) = log10(sqrt(2 * pi * n)) + n * log10(n / e) t = (num*log(num) - num + 0.5*log(2*num*PI))/log(10); ans = t+1; printf("%d/n",ans); } int main() { while(scanf("%d",&n)!=EOF) { while(n--) { scanf("%d",&num); solve(); } } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例