HDU 1018 大数问题
发布时间:2020-12-14 03:51:21 所属栏目:大数据 来源:网络整理
导读:Big Number Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22912????Accepted Submission(s): 10325 Problem Description In many applications very large integers numbers are required. S
Big NumberTime Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22912????Accepted Submission(s): 10325
Problem Description
In many applications very large integers numbers are required. Some of these applications are using keys for secure transmission of data,encryption,etc. In this problem you are given a number,you have to determine the number of digits in the factorial of the number.
?
Input
Input consists of several lines of integer numbers. The first line contains an integer n,which is the number of cases to be tested,followed by n lines,one integer 1 ≤ n ≤ 10
7?on each line.
?
Output
The output contains the number of digits in the factorial of the integers appearing in the input.
?
Sample Input
?
Sample Output
?
题目大意:
? ? ? ? ? ?求一个数的阶乘 最终输出结果的位数
解题方法:
? ?利用公式:
两种做法:
一、
N!=1*2*3....*n 求以10 为底的对数就可以了 log10(n!)=log10(1)+ log10(2) +log10(3)...+log10(n); 不过最终误差 为 1 log10(10) = 1 位数相差1? 二、 斯特林数,第一类斯特林数就可以做这个! 斯特林数能够做一切关于阶乘有关的大数运算 ?具体内容自行百度 这里给出递归公式: log10(n!)=1.0/2*log10(2*pi*n)+n*log10(n/e) 然后附上代码了;
#include<iostream> #include<cmath> using namespace std; int main() { int n,i,t; cin>>n; while(n--) { cin>>t; double ans = 1; for(i = 1; i <= t; i++) { ans += log10((double)i); } cout<<(int)ans<<endl; } return 0; } 其次 利用斯特林公式求解:
#include<iostream> #include<cmath> using namespace std; #define pi 3.1415926 #define e 2.7182818284590452 int main() { int t; cin>>t; while(t--) { int n ; cin>>n; int ans ; ans = 1.0/2*log10(2*pi*n) +n*log10(n/e); cout<<ans+1<<endl; } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |