酷酷的枪手 发表于 2023-2-19 14:15:21

请教一下摩尔计票法

我能理解用摩尔计数法找列表里出现次数大于一半的原理,但是这道题的原理我不是很懂。

ExiaGN001 发表于 2023-2-21 23:02:50

srds,重复发帖(

酷酷的枪手 发表于 2023-2-22 21:15:58

ExiaGN001 发表于 2023-2-21 23:02
srds,重复发帖(

srds是啥意思。。。{:5_99:},主要是没人解答我啊,我以为我的提问被淹没了。。。

ExiaGN001 发表于 2023-2-22 21:26:47

酷酷的枪手 发表于 2023-2-22 21:15
srds是啥意思。。。,主要是没人解答我啊,我以为我的提问被淹没了。。。

srds=虽然但是
重复发帖是被禁止的
没人回=没人会=没人能解答

yzs193728 发表于 2023-3-7 13:27:49

循环作用是选出列表中数量最多的两个数:每出现一个不是major1和major2的数时,major1和major2的数量都抵消一个,major1和major2任意一个被抵消完了,就用新来的数替代(诸侯争霸)。

不二猫猫 发表于 2023-3-14 22:56:53

这道题目的主要思路是使用递归函数求解两个整数的最大公约数和最小公倍数。

首先,我们需要明确最大公约数和最小公倍数的定义:

最大公约数:指两个或多个整数共有约数中最大的一个。例如,12和18的最大公约数是6,因为12和18都能被6整除,而其他的公约数(如1、2、3、4、…)都小于6。
最小公倍数:指两个或多个整数公有的倍数中最小的一个。例如,4和6的最小公倍数是12,因为4的倍数包括4、8、12、16、20、…,6的倍数包括6、12、18、24、…,它们公共的倍数是12、24、36、…,其中最小的一个是12。
接下来,我们可以使用递归函数来求解最大公约数和最小公倍数。具体来说,我们可以使用欧几里得算法(也称辗转相除法)来求解最大公约数,使用最大公约数求解最小公倍数。

欧几里得算法的基本思想是,假设有两个整数a和b(a>=b),它们的最大公约数为gcd(a,b),那么可以得到以下等式:

gcd(a,b) = gcd(b, a%b)
其中,%表示取余运算。根据这个等式,我们可以使用递归函数来求解最大公约数。具体来说,如果b等于0,那么gcd(a,b)就等于a;否则,gcd(a,b)等于gcd(b, a%b)。

最大公约数求解完毕后,我们可以使用以下公式来求解最小公倍数:

lcm(a,b) = a * b / gcd(a,b)
其中,lcm表示最小公倍数。根据这个公式,我们可以使用递归函数来求解最小公倍数。

在代码实现中,我们需要注意以下几点:

递归函数必须有一个终止条件,否则会导致无限递归。
在计算最大公约数时,需要保证a>=b,否则交换a和b的值。
在计算最小公倍数时,需要注意整数乘法可能会溢出,可以使用long long类型来避免这个问题。
下面是一份可能的代码示例:

#include <iostream>
using namespace std;

// 求最大公约数
int gcd(int a, int b) {
    if (b == 0) {
      return a;
    } else {
      return gcd(b, a % b);
    }
}

// 求最小公倍数
long long lcm(int a, int b) {
    long long g = gcd(a, b);
    return (long long)a * b / g;
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << gcd(a, b) << endl;
    cout << lcm(a, b) << endl;
    return 0;
}

酷酷的枪手 发表于 2023-3-15 20:28:54

不二猫猫 发表于 2023-3-14 22:56


谢谢你捏
页: [1]
查看完整版本: 请教一下摩尔计票法