Problem Description |
在许多应用程序中,需要非常大的整数数。其中一些应用程序使用密钥进行安全传输数据、加密密钥等。在这个问题中,你会得到一个数字,你必须确定这个数字的阶乘中的位数
Input |
输入由几行整数组成。第一行包含一个整数n,它是要测试的案例数,然后是n行,每行上有一个整数1≤n≤10e7.
Output |
输出包含在输入中出现的整数的阶乘中的位数
Sample Input 2 10 20 Sample Output 7 19 |
题目分析:因输入的n值最大能达至10e7,其阶乘数已经完全超出了普通计算机所能承载的范围(即使是BigInterger也不能承受),故不能通过传统的计算方法输出,而应当在计算过程中对各个乘数进行处理!
由数学知识有,判断一个数字N的位数的方法为——
n=⌊lgN⌋+1
而因lg(A*B)=lgA+lgB,故上述的lgN=lg(N1*N2*N3*N4*......*Nn)=lgN1+lgN2+lgN3+...+lgNn,即只需对乘数每一项加入对数函数的操作,最后相加就能得出lgN的值,再进行取整和加一的操作.
import java.util.Scanner;
public class oj1018 {
public static void main(String[]args){
Scanner kc=new Scanner(System.in);
int m=kc.nextInt();
while(m>0){
int n=kc.nextInt();
double sum=0;
for (int i=1;i<=n;i++){
sum+=Math.log10(i);底数为10的对数函数在Java里可表示为Math.log10()
}
int num=(int)sum+1;//通过int进行向下取整
System.out.println(num);
m--;
}
}
}