Hdoj 1018

本文介绍了一种计算大整数阶乘位数的方法,利用对数特性避免直接计算大数值,采用《计算机程序设计艺术》中的公式简化运算,并提供C语言实现代码。

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

题目 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.

由于求n!,其数量级大,所以不能直接求出值。

考虑到一个数的位数=[log10a]+1,而对于n!,有位数=[log101+log102+…+log10n]+1,即可化简。

更进一步:《计算机程序设计艺术》中给出了另一个公式
n! = sqrt(2πn) * ((n/e)^n) * (1 + 1/(12n) + 1/(288n2) + O(1/n3))
两边对10取对数
忽略后两项,得到公式
log10(n!) = log10(sqrt(2*πn)) + n * log10(n / e)

#include<stdio.h>
#include<math.h>
main(){
int n,i,x;
double sum;
 scanf("%d",&n);
 	while(n&&scanf("%d",&x)!=EOF){
 		n--;
 		for(sum=0,i=2;i<=x;i++)
 		sum+=log10((double)i);
 		printf("%d",(int)sum+1);
 	    printf("\n");
	 }
	 	return 0;
}

注意:

  1. while(n&&scanf("%d",&x)!=EOF)语句中两个条件的顺序对程序有影响。
  2. 输出的格式,以及结束(return 0)需要规范完备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值