POJ 1423 解题报告

本文探讨了斯特林公式在计算大整数阶乘时的应用,特别关注如何确定阶乘的位数。通过输入整数序列,输出对应阶乘的位数,并详细解释了相关数学函数的使用,如指数函数、对数函数及三角函数。同时强调了不同类型数据转换的重要性,确保计算准确无误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下:

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 <= m <= 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


这一题主要是关于斯特林公式的考察
 


 
求指数函数时 形式 double exp(double x) 如 e = exp(1.0)
求以10为底的对数 形式 double log10(double x)
求以e为底的对数  形式  double log(double x)
     
求反三角函数 形式 double asin(double value) 其余类似

求三角函数值 形式 double sin(double angle) 其余类似

求tan反三角函数值 形式 double atan(double x, double y)


关于类型转化  double s;
               int x;
                       int y;
    
                        x = s + 1;
                y = (int)s + 1;

               其中 x与y不一定相等

原因: int型数据与double类型数据在计算机中存储方式不同 没有进行强制类型转化将可能导致转换出现自己意料之外的结果 

解题代码:

# include <stdio.h>
# include <math.h>

int main(void)
{
long int i;
long int testnum;
long int num[1000000];
long double lognum;
long int result;
long int j;
double e;

scanf("%ld", &testnum);
e = exp(1.0);

for(i = 0; i <= testnum - 1; ++i)
{
scanf("%ld", &num[i]);
result = (int)(0.5 * log10(2 * acos(-1.0) * num[i]) + num[i] * log10(num[i] / e)) + 1;
printf("%ld\n", result);
}

return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值