算法作业题解#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

本次题目都很水,所以就随便水一下题解

posted @ 2022-02-25 17:49  流白李  阅读(56)  评论(0编辑  收藏  举报