nyoj 69-数的长度 (log10(),计算数的位数)

69-数的长度


内存限制:64MB 时间限制:3000ms 特判: No
通过数:10 提交数:13 难度:1

题目描述:

    N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?

输入描述:

首行输入n,表示有多少组测试数据(n<10)
随后n行每行输入一组测试数据 N( 0 < N < 1000000 )

输出描述:

对于每个数N,输出N!的(十进制)位数。

样例输入:

3
1
3
32000

样例输出:

1
1
130271

分析:
  1、n个数相乘,最终得到的数它的位数为n个数每个数进行log10()的运算再求和,最后加上1;
  2、ps:用Java做大数乘法最后来数位数,会超时;

C/C++代码实现(AC):
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <stack>
 7 #include <map>
 8 #include <queue>
 9 #include <set>
10 
11 using namespace std;
12 
13 int main()
14 {
15     int t;
16     scanf("%d", &t);
17     while(t --)
18     {
19         double a, ans = 0;
20         scanf("%lf", &a);
21         for(int i = 1; i <= a; ++ i)
22             ans += log10(i);
23         printf("%d\n", int(ans) + 1);
24     }
25     return 0;
26 }

Java代码(TLE):

 

 1 import java.util.*;
 2 import java.io.*;
 3 import java.math.*;
 4 
 5 public class Main {
 6     public static void main(String args[]) {
 7         Scanner scan = new Scanner(System.in);
 8         int t = scan.nextInt();
 9         while (t > 0) {
10             t--;
11             int k = scan.nextInt();
12             BigInteger a = BigInteger.ONE;
13             for(int i = 1; i <= k; ++ i) {
14                 a = a.multiply(BigInteger.valueOf(i));
15             }
16             String str = a.toString();
17             System.out.println(str.length());
18         }
19     }
20 }

 

 

posted @ 2018-05-30 15:42  GetcharZp  阅读(222)  评论(0编辑  收藏  举报