標籤:des style blog color os io for ar
Problem DescriptionIn 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. InputInput 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. OutputThe output contains the number of digits in the factorial of the integers appearing in the input. Sample Input21020 Sample Output719 這題是要求n的階乘的位元,而n的階乘是n個數的乘積,那麼要是我們能把這個問題分解就好了。 對於任意一個給定的正整數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
根據這個思路我們很容易寫出程式
#include<stdio.h>#include<math.h>int main(){ int i,n,t,j; double r; scanf("%d",&n); for(i=0;i<n;i++) { r=0; scanf("%d",&t); for(j=1;j<=t;j++) { r+=log10(j); } printf("%d\n",(int)r+1); }}