Big Number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20623 Accepted Submission(s): 9261
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 ≤ 107 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的階乘的位數,如果n較大時,n的階乘必将是一個
很大的數,題中說1<=n<10000000,當n=10000000時可以說n
的階乘将是一個非常巨大的數字,對于處理大數的問題,我
們一般用字元串,這題當n取最大值時,就是一千萬個數字相
乘的積,太大了,就算儲存在字元串中都有一點困難,而且
一千萬個數字相乘是會涉及到大數的乘法,大數的乘法是比較
耗時的,就算計算出結果一般也會逾時。這讓我們不得不抛棄
這種直接的方法。
再想一下,這題是要求n的階乘的位數,而n的階乘是n個數的
乘積,那麼要是我們能把這個問題分解就好了。
在這之前,我們必須要知道一個知識,任意一個正整數a的位數
等于(int)log10(a) + 1;為什麼呢?下面給大家推導一下:
對于任意一個給定的正整數a,
假設10^(x-1)<=a<10^x,那麼顯然a的位數為x位,
又因為
log10(10^(x-1))<=log10(a)<(log10(10^x))
即x-1<=log10(a)<x
則(int)log10(a)=x-1,
即(int)log10(a)+1=x
即a的位數是(int)log10(a)+1
我們知道了一個正整數a的位數等于(int)log10(a) + 1,
現在來求n的階乘的位數:
假設A=n!=1*2*3*......*n,那麼我們要求的就是
(int)log10(A)+1,而:
log10(A)
=log10(1*2*3*......n) (根據log10(a*b) = log10(a) + log10(b)有)
=log10(1)+log10(2)+log10(3)+......+log10(n)
現在我們終于找到方法,問題解決了,我們将求n的階乘的位
數分解成了求n個數對10取對數的和,并且對于其中任意一個數,
都在正常的數字範圍之類。
總結一下:n的階乘的位數等于
(int)(log10(1)+log10(2)+log10(3)+......+log10(n)) + 1
根據這個思路我們很容易寫出程式
****************************************************/
//AC代碼:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int t,n,i;
double m;
while(cin>>t)
{
while(t--)
{
cin>>n;
m=0;
for(i=1;i<=n;i++)
{
m+=log10(double(i));
}
cout<<int(m)+1<<endl;
}
}
return 0;
}