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;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
