Digits of Factorial LightOJ - 1045
2024-08-31 01:25:19
题目就不再发了,大致意思就是给你一个十进制数n,算出阶乘后转换成K进制的数,你来算一下它的位数。
坑点在哪呢,就是这个数可能算阶乘的时候没放弄了,比如1000000,做过最多单算阶乘的题也就是让你算到10000,所以这个如果按正常步骤来写肯定不行啦。
本题主要运用两个定理:
1丶 十进制位数就是 (int)log10(n),比如,1234,就是4,55555位数就是5。
对应K进制位数就是logk(n),但是math.h或者库函数里边log函数的底数只有固定的几个能直接用的,所以需要用到换底公式啦
2丶:loga(n)=logm(n)/logm(a)=ln(n)/ln(a);
3丶:核心思想 要求K进制位数:logk(n!)=ln(n!)/lnk + 1={ln(1)+ln(2)+ln(3)+...+ln(n)}/lnk + 1;
AC代码如下:大家看的时候可以自己再理解理解看看有没有更好的方法来解这道题啦,我这水平也有限,代码可能还不够完善呢。
#include<stdio.h>
#include<math.h>
#include<string.h>
#define ll long long
double aa[];
int main()
{ int t,c,m,n,i;
double ww;
scanf("%d",&t);
memset(aa,,sizeof(aa));
for(i=;i<=;i++)
aa[i]+=aa[i-]+log(i);//打个表来存一下前1000000个数的log(阶乘),会节省很多时间的
for(int i=;i<=t;i++)
{
scanf("%d%d",&m,&n);
if(m==)
printf("Case %d: 1\n",i);
else
{
ww=aa[m];//此处两行就是上边我介绍的核心思想了
ww=ww/log(n)+;//至于为什么+1,自己再想想啦
printf("Case %d: %d\n",i,(int)ww);
}
}
return ;
}
最新文章
- objective-c 语法快速过(5)
- SQL Server 2008 R2——软件创建月表时同时创建一个触发器
- git 格式化输出版本信息
- LINQ TO DATATABLE/DATASET基本操作之-简单查询
- 通配符+countif()解决大于15位数的计数问题
- 怎么从sqlserver 数据库导出 insert 的数据语句
- Windows如何安装自定义服务
- npm常用命令解析
- QTimerLine类学习
- splice()函数的使用方法
- OC-多线程GCD的使用细节
- ArcPy 重命名拷贝删除图层
- wrk 压力测试 http benchmark POST接口
- shell脚本--php执行普通shell命令
- POJ 3295 Tautology(构造法)
- mqtt 服务器与客户端通讯
- 如何读写json文件
- CentOS系统时间与网络同步
- Mac下的UI自动化测试 (四)
- Java基础笔记(十七)——继承(续)final