HDU 1018(阶乘位数 数学)
题意是求 n 的阶乘的位数。
直接求 n 的阶乘再求其位数是不行的,开始时思路很扯淡,想直接用一个数组存每个数阶乘的位数,用变量 tmp 去存 n 与 n - 1 的阶乘的最高位的数的乘积,那么 n 的阶乘的位数就等于 n - 1 的阶乘的位数加 tmp 的位数再减去 1。
但这种做法是不对的,例如有可能最高位与 n 的乘积结果是 99,而其实 n 与其他位的乘积结果是能进到这一位的,也就是说实际应该在 n - 1 的阶乘位数上增加 2 ( 3 -1 ) 位。而在对样例测试时也发现 n 为 10 的时候结果尚正确,但当 n 为 20 的时候就比正确结果少了 1,也就是说发生了上述情况。
抱着侥幸心理,又再次将每次乘以最高位的做法调整成了每次乘以最高的两位,这一次当 n 为 20 时结果依然正确,但是内存超了......
错误代码:
#include <bits/stdc++.h>
using namespace std;
int tmp,dig[];
int getdigit(int n)
{
int a();
while(n)
{
n/=;
a++;
}
return a;
}
void make()
{
int digit;
dig[] = ;
dig[] = ;
dig[] = ;
dig[] = ;
tmp = ;
for(int i = ; i <= ; i++)
{
tmp *= i;
digit = getdigit(tmp);
dig[i] = digit + dig[i-] - ;
for(int j = ; j < digit; j++) tmp/=;
}
}
int main()
{
int t,ans,n;
scanf("%d",&t);
make();
while(t--)
{
scanf("%d",&n);
printf("%d\n",dig[n]);
}
return ;
}
在借鉴了其他人的做法后,才觉得对这道题有了一点正确的思路:
首先,一个数 x 的位数可以用以 10 为底取对数再向上取整的方法求得,即 digit( x ) = ceil ( log10( x ) );
那么,阶乘的位数可以直接求:digit( n! ) = ∑ log10( i ) ( i 从 1 取到 n )
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t,n;
double ans;
scanf("%d",&t);
while(t--)
{
ans = ;
scanf("%d",&n);
for(int i = ; i <= n; i++)
{
ans += log10(i);
}
printf("%d\n",(int)ans+);
}
return ;
}
另外,在求 n 的阶乘的时候用 Stirling 公式 也是很好的做法,
代码如下:
#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-);
int main()
{
int t,n,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ans = ceil((log(n)*n - n + 0.5*log(*pi*n) )/ log());
printf("%d\n",ans);
}
return ;
}
HDU 1018(阶乘位数 数学)的更多相关文章
- HDU 1018 阶乘数的位数
题目大意: 将一个数开阶乘后得到的值,来求这个值的位数 n! = 1*2*3*4...*n 对于求一个数的位数的方法为ans = lg(n!) + 1 那么就可以看作 ans = lg(1) + lg ...
- HDU 1018 Big Number 数学题解
Problem Description In many applications very large integers numbers are required. Some of these app ...
- hdu 1018 Big Number 数学结论
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 【HDOJ1018】【大数阶乘位数】【斯特林公式】
http://acm.hdu.edu.cn/showproblem.php?pid=1018 Big Number Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1018 Big Number
LINK:HDU 1018 题意:求n!的位数~ 由于n!最后得到的数是十进制,故对于一个十进制数,求其位数可以对该数取其10的对数,最后再加1~ 易知:n!=n*(n-1)*(n-2)*...... ...
- Java实现第九届蓝桥杯阶乘位数
阶乘位数 题目描述 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞&qu ...
- java实现第七届蓝桥杯阶乘位数
阶乘位数 阶乘位数 9的阶乘等于:362880 它的二进制表示为:1011000100110000000 这个数字共有19位. 请你计算,9999 的阶乘的二进制表示一共有多少位? 注意:需要提交的是 ...
- java实现第四届蓝桥杯阶乘位数
阶乘位数 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格 ...
- HDU 1018 Big Number (阶乘位数)
题意: 给一个数n,返回该数的阶乘结果是一个多少位(十进制位)的整数. 思路: 用对数log来实现. 举个例子 一个三位数n 满足102 <= n < 103: 那么它的位数w 满足 w ...
随机推荐
- 【XSY2332】Randomized Binary Search Tree 概率DP FFT
题目描述 \(\forall 0\leq i<n\),求有多少棵\(n\)个点,权值和优先级完全随机的treap的树高为\(i\). \(n\leq 30000\) 题解 设\(f_{i,j}\ ...
- day3 python简介 IDE选择
优势趋势基于c语言.c语言是编译底层语言,c跨平台需要重新编译,pyh可以直接使用c的库文件,比起c有绝对的开发效率目前为全球语言使用频率为第四名,第一java.从几年前第8名已超越php第6名. 擅 ...
- PSR-4 规范实例讲解 -- php 自动加载
参考 参考文档:https://www.kancloud.cn/thinkphp/php-fig-psr/3144 参考实例:https://github.com/php-fig/fig-standa ...
- android 通过修改图片像素实现CircleImageView
CircleImageView实现方法有很多种,各有优缺点,因此需要按照不同的场景使用.我们今天使用修改图片像素的方法实现CircleImageView,主要知识点无非是勾股定理和点到圆形的距离. 素 ...
- A1098. Insertion or Heap Sort
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- Java 多个文件压缩下载
有时候会有多个附件一起下载的需求,这个时候最好就是打包下载了 首先下面这段代码是正常的单个下载 public void Download(@RequestParam("file_path&q ...
- [luogu3938][斐波那契]
题目链接 思路 首先可以看出来每个月新增的兔子构成的斐波那契数列.然后每代兔子都可以用斐波那契数列中的一个数来表示.所以对于每只兔子都能在斐波那契数列中找到他所属的一个位置.因为每个兔子都是在两个月之 ...
- 面试篇——mysql
背景:在面试过程中发现很多公司对sql查询有要求,虽然不高,但是简单常见的sql查询必须熟练的掌握,否则一面都无法通过,痛定思痛,必须要深入了解下!!! 注释符号 面试题1 查询没有成绩的学生信息 参 ...
- 在Derby中取得刚刚插入的“递增”类型的字段值
现在才发现采用不同的数据库,对写程序影响很大. 以前常用SQL Server2000或Access,可能是因为都是Microsoft公司的产品,所以在从不同的平台转换的时候问题不是很大. 现在采用De ...
- vue学习(2)
node.js介绍与npm操作 1.node就是JavaScript的一个运行环境(平台),他不是一门语言,也不是JavaScript框架,可以用来开发服务器端应用程序,web系统,其特点是体积小.快 ...