加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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 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. 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
  
  
2 10 20
?

Sample Output
  
  
7 19
?

题目大意:
? ? ? ? ? ?求一个数的阶乘 最终输出结果的位数
解题方法:
? ?利用公式:
两种做法:
一、

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读