算法作业题解#1
阅前提醒:每个标题都有做超链接,右上可以通过目录快速找到需要的题目的位置。
本文使用C++代码。
PS:oj 3.0版本已支持自动查重功能,所以题目我都只会附上部分代码,防止我被查重。
How many zero
题意:
给定一个数字 n,计算n!的末尾一共有多少个0(1<=n<=100)
题解:
很容易想到,末尾的 0 仅与因子中 2 和 5 的个数有关,故而我们只需要得到 n!中含 2 的个数以及 5 的个数即可知道末尾 0 的个数。
- 方法一:暴力解法
for(int i=2;i<=n;i++) { int x=i; while(x%2==0) { cnt1++;x/=2; } while(x%5==0) { cnt2++;x/=5; } } cout<<max(cnt1,cnt2);
- 方法二:
通过观察易知,因子中 2 的出现次数一定大于 5 的出现次数,故可化简为求 5 的出现次数。for(int i=2;i<=n;i++) { int x=i; while(x%5==0) { cnt++;x/=5; } } cout<<cnt;
- 方法三:
进一步观察,我们可以发现:每隔 5 个数,产生一个因子 5 ,所以 5 的出现次数为 n/5 ,每隔 25 个数额外产生一个因子5。cout << n / 5 + n / 25;
奇数个数统计
题解:
使用位运算优化奇偶数判断:
for (int i = 0; i < 10; i++) { cin >> n; if (n & 1)cnt++; }
最大公约数
上板子:
考察的就是gcd的模板
int gcd(int a,int b) { return !b ? a : gcd(b, a%b); }
元素相差最小的值
题意:
给定一个数组,找到两个最相近的值,求他们的差值。
题解:
使用sort排序,然后用一遍for循环计算相邻两个值的差值,保存最小值
制作:BDT20040
本次题目都很水,所以就随便水一下题解