hdu 1018 Big Number

本文介绍了两种计算N!位数的方法:一是通过对各因数取对数并累加求和,二是应用斯特林公式计算对数值。文章提供了C++实现代码。

数论里的题目


第一种做法:

N!=1*2*3....*n

求位数我们一般用对一个数取对数就可以了 ,

log10(n!)=log10(1)+ log10(2) +log10(3)...+log10(n);

所以循环求和就可以了!

但是这里注意一点 结果要加1!因为这里计算出来的 log10(1)=0  !

所以结果要加上这个误差 ‘1’


#include <stdio.h>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
 int count,var,j;
 double sum;
 scanf("%d",&count);
 while(count--)
 {
  sum=0;
  scanf("%d",&var);
  for(j=1;j<=var;j++)
   sum+=log10(j*1.0);
  printf("%d\n",(int)sum+1);
 }
}

第二种做法:

利用数学公式:斯特林公式:ln(N!) = Nln(N)-N + 0.5*ln(2*N*pi)
                                 还有对数换底公式啊:loge(N!)/loge(10)=log10(N!);

#include<iostream>
#include<stdio.h>
#include<math.h>
#define pi 3.141592654
using namespace std;
int main()
{
	int n,t;
	double sum;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		double temp=(n*log(n)-n+0.5*log(2*n*pi))/log(10);
		printf("%d\n",(int)temp+1);
	}
	return 0;
}




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值