B4004 寻找倍数

题目描述

小杨有一个包含 nn 个正整数的序列 A=[a1,a2,…,an]A=[a1​,a2​,…,an​],他想知道是否存在 i(1≤i≤n)i(1≤i≤n) 使得 aiai​ 是序列 AA 中所有数的倍数。

输入格式

第一行包含一个正整数 tt,代表测试用例组数。

接下来是 tt 组测试用例。对于每组测试用例,一共两行。

其中,第一行包含一个正整数 nn;第二行包含 nn 个正整数,代表序列 AA。

输出格式

对于每组测试用例,如果存在 i(1≤i≤n)i(1≤i≤n) ,满足对于所有 k(1≤k≤n)k(1≤k≤n) aiai​ 是 akak​ 的倍数,输出 Yes,否则输出 No

输入输出样例

输入 #1

2
3
1 2 4
5
1 2 3 4 5

输出 #1

Yes
No

解析:

        如果一个数能是序列中所有数的倍数,那么它一定是序列中的最大值。例如 [1,2,3,6][1,2,3,6] 中,66 是所有数的倍数,而且它是序列中的最大值。

        因此,我们要找到序列中的最大值 tt

### C++ 实现最小公倍数算法 在 C++ 中,可以通过多种方法来实现最小公倍数(Least Common Multiple, LCM)的计算。以下是几种常见的实现方式。 #### 方法一:利用 `<numeric>` 库中的 `std::lcm` 函数 C++ 提供了一个标准库头文件 `<numeric>`,其中包含了用于计算最大公约数 (`std::gcd`) 和最小公倍数 (`std::lcm`) 的函数。这种方法简单高效,适合快速开发场景。 ```cpp #include <iostream> #include <numeric> int main() { int num1, num2; std::cout << "输入两个整数: "; std::cin >> num1 >> num2; // 使用 std::lcm 计算最小公倍数 int leastCommonMultiple = std::lcm(num1, num2); std::cout << "最小公倍数: " << leastCommonMultiple << std::endl; return 0; } ``` 此代码片段展示了如何通过调用 `std::lcm` 来获取两个整数的最小公倍数[^1]。 --- #### 方法二:基于辗转相除法的手动实现 如果不依赖于标准库或者需要自定义逻辑,则可以手动实现最小公倍数的计算。通常的做法是先计算两个数的最大公约数 (Greatest Common Divisor, GCD),再根据以下关系得出最小公倍数: \[ LCM(a, b) = \frac{|a \times b|}{GCD(a, b)} \] 下面是一个使用辗转相除法计算 GCD 并进一步得到 LCM 的例子: ```cpp #include <iostream> using namespace std; // 辗转相除法求最大公约数 int gcd(int x, int y) { if (y == 0) return x; return gcd(y, x % y); } // 手动计算最小公倍数 long long lcm(int x, int y) { if (x == 0 || y == 0) return 0; // 特殊情况处理 return abs((long long)x / gcd(x, y) * y); // 防止溢出 } int main() { int x, y; cin >> x >> y; cout << "最小公倍数: " << lcm(x, y) << endl; return 0; } ``` 上述代码实现了手写版本的 GCD 和 LCM 功能,并特别注意了防止整型溢出的情况[^2]。 --- #### 方法三:暴力枚举法 对于初学者来说,还可以采用一种较为直观但效率较低的方式——即从小到大依次尝试找到第一个能被两个数同时整除的结果作为其最小公倍数。不过需要注意的是,这种做法仅适用于较小的数据规模。 ```cpp #include <iostream> using namespace std; int main(){ long long a, b; cin>>a>>b; for(long long i=1;;i++){ if(i%a==0 && i%b==0){ cout<<i; break; } } return 0; } ``` 尽管该方案易于理解,但在实际应用中并不推荐因为性能原因[^3]。 --- ### 总结 以上介绍了三种不同的策略用来解决寻找两个正整数之间最小公倍数值这一问题。每种都有各自适用场合以及优缺点所在,在具体项目当中可以根据需求灵活选用合适的技术手段完成任务目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超人小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值