POJ1423 Big Number(数学)

25 篇文章 0 订阅

题意:

输出n!的位数

要点:

n!的位数=log10(n!)+1

有两种方法:

1.直接用log(n!)=log10(1)+log10(2)+……+log10(n)打表做,把1~1e7的先全算出来,这种可以做但比较慢

2.纯数学做法,用斯特林公式算出近似值,因为是求位数,近似值够用了

斯特林公式:   

方法一(打表):

15131753Seasonal1423Accepted39584K610MSG++387B2016-02-01 18:02:04

//必须要用G++,用C++会出错
#include<stdio.h>
#include<math.h>
const int maxn = 1000000;
int num[maxn+1];//必须在外面建立数组,否则会出错
                //全局变量占内存多但速度快
int main()
{
	int t,i;
	scanf("%d", &t);
	double d=0;
	for (i = 1; i <= maxn; i++)//打表
	{	
		d+= log10(i);
		num[i] = (int)d + 1;//要+1,可以从1来判断,位数和log10差1
	}	
	while (t--)
	{
		scanf("%d", &i);
		printf("%d\n", num[i]);
	}
	return 0;
}


方法二(斯特林公式):

15132048Seasonal1423Accepted204K0MSC++291B2016-02-01 20:04:29

#include<stdio.h>
#include<math.h>
const double e = 2.7182818284590452354, pi = 3.141592653589793239;

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n;
		scanf("%d", &n);
		double num;
		num = log10(2 * pi*n)/2.0 + n*log10(n / e);//斯特林公式
		printf("%d\n", (int)num+1);//最后别忘+1
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值