数论里的题目
第一种做法:
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;
}
本文介绍了两种计算N!位数的方法:一是通过对各因数取对数并累加求和,二是应用斯特林公式计算对数值。文章提供了C++实现代码。
2万+

被折叠的 条评论
为什么被折叠?



