c++ - 如何找到数组中相对质数的对?
问题描述
我需要将数字放入一个数组中,并取与间隔末尾等距离的数字
示例:6 个数字,{3, 4, 6, 36, 45, 97} -> 3 和 97, 4 和 45, 6 36;
然后我需要检查它们是否相对质数。
示例:3 和 97 是互质数,因为它们没有公约数,4 和 45 也是如此,但 6 和 36 不是,因为它们有 2、3 和 6。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n, nn, nnn, v[1000], cntPairs = 0;
cout << "How many elements?\n";
cin >> n;
for(int i=0; i<n; i++)
cin >> v[i];
nn = n/2;
nnn = ceil(n/2);
cout << "The pairs are: \n";
if(n % 2 == 0){
for(int i=0; i<nn; i++){
if(v[i] % v[n - i - 1] != 0){
cntPairs++;
cout << v[i] << " " << v[n - i - 1] << "\n";
}
}
}
if(n % 2 == 1){
for(int i=0; i<nnn; i++){
if(v[i] % v[n - i - 1] !=0){
cntPairs++;
cout << v[i] << " " << v[n - i - 1] << "\n";
}
}
}
cout << endl << "Number of pairs: " << cntPairs;
return 0;
}
现在,我的程序从我所关心的方面做到了这一点,但是如果我将 6 和 36 放在它们之间,它表示它们之间是素数,但它们不是,我找不到一种方法来实现它,所以它对 36 和 6 进行计算,而不是 6 和 36。
我唯一的假设是我必须在 2 中找到最大的并将较大的放在第一位,但我不知道如何。
解决方案
两个整数互质当且仅当它们的最大公约数为 1。因此,要检查x
和是否y
互质,请执行std::gcd(x, y) == 1
(std::gcd 需要 C++17,GCC 有 __gcd,或者自己实现)。
其他意见:
ceil(n/2)
等于n/2
。(n+1)/2
如果您想四舍五入,请使用。- 您不需要单独考虑
n
偶数和奇数的情况。这适用于所有情况:
for (int i = 0; i < n/2; i++) {
if (std::gcd(v[i], v[n-i-1]) == 1) {
/* ... */
}
}
推荐阅读
- macos - Cordova 需要 xcodebuild 9.0.0 或更高版本
- go - 单个 defer func() 可以被其他函数共享吗?
- javascript - 下载带有图像的画布是空图像
- typescript - 将 eslint 与 @typescript-eslint/parser 一起使用,但 typescript 规则不起作用
- python-3.x - AttributeError:“numpy.dtype”对象没有属性“is_floating”
- algorithm - 区间内赚取的最大利润
- perl - 我正在尝试从此脚本中获取 x、y 和 z 的三个参数,但它所做的只是返回一个不是我要查找的尺寸的值?
- regex - 正则表达式的问题
- javascript - 在 Javascript Calculator 中获取 NaN 作为输出
- android - 如何在 Android Studio 中使用 java 代码克隆视图