
在计算机编程领域,找到给定范围内与特定数字互质的数字数量可能是一个常见的任务。互质数,也称为相对质数,是指除了1以外没有其他公因数的数字。在本文中,我们将通过使用C++语言来探讨在给定整数L和R之间找到与特定数字P互质的数字数量。
语法
我们将首先概述我们在接下来的代码示例中将使用的方法的语法 -
int countCoprimes(int L, int R, int P);
算法
我们将使用的算法来计算互质数的数量如下所示−
方法1:朴素方法
我们将讨论的第一种方法是朴素方法。为了使用欧几里得算法验证与P的互质性,这种方法需要通过迭代来检查指定范围内的每个数字。
Example
的中文翻译为:示例
#include <iostream>
int countCoprimes(int L, int R, int P) {
int count = 0;
for (int num = L; num <= R; num++) {
int a = num;
int b = P;
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
if (a == 1)
count++;
}
return count;
}
int main() {
int L = 1; // Set the starting range value
int R = 100; // Set the ending range value
int P = 7; // Set the value of P
int result = countCoprimes(L, R, P);
std::cout << "Count of numbers between " << L << " and " << R << " coprime with " << P << ": " << result << std::endl;
return 0;
}
输出
Count of numbers between 1 and 100 coprime with 7: 86
Explanation
的中文翻译为:解释
countCoprimes函数接受三个参数:L(起始范围值),R(结束范围值)和P(P的值)。
在countCoprimes函数内部,我们初始化一个变量count为0,它将存储互质数的计数。
for循环迭代从L到R的每个数字num。
在循环中,我们分别将变量a和b初始化为num和P。
我们在while循环中使用欧几里得算法,通过重复交换和执行模运算来找到a和b的最大公约数(GCD)。
如果GCD(存储在a中)等于1,这意味着num和P是互质的。在这种情况下,我们增加计数变量。
我们通过仔细迭代所有数字来最终确定我们的计数值,并在完成后将其返回。
主要功能周到地为L、R和P变量分配合适的值。
然后我们使用提供的值调用countCoprimes函数,并将结果存储在result变量中。
最后,我们显示结果,即在L和R之间与P互质的数字的计数。
方法二:质因数分解
这种策略涉及利用 P 的质因数分解以精确计算落在 L 和 R 之间的互质整数的数量。
Example
的中文翻译为:示例
#include <iostream>
#include <unordered_set>
int countCoprimes(int L, int R, int P) {
std::unordered_set<int> factors;
int tempP = P;
for (int i = 2; i * i <= tempP; i++) {
while (tempP % i == 0) {
factors.insert(i);
tempP /= i;
}
}
if (tempP > 1)
factors.insert(tempP);
int count = 0;
for (int num = L; num <= R; num++) {
bool isCoprime = true;
for (int factor : factors) {
if (num % factor == 0) {
isCoprime = false;
break;
}
}
if (isCoprime)
count++;
}
return count;
}
int main() {
int L = 1; // Set the starting range value
int R = 100; // Set the ending range value
int P = 7; // Set the value of P
int result = countCoprimes(L, R, P);
std::cout << "Count of numbers between " << L << " and " << R << " coprime with " << P << ": " << result << std::endl;
return 0;
}
输出
Count of numbers between 1 and 100 coprime with 7: 86
Explanation
的中文翻译为:解释
countCoprimes函数接受三个参数:L(起始范围值),R(结束范围值)和P(P的值)。
我们创建一个无序因子集合来存储P的质因子。我们将一个临时变量tempP初始化为P。
我们从2迭代到tempP的平方根。如果tempP可以被i整除,我们将i添加到因子集合中,并将tempP除以i,直到tempP不再能被i整除。
如果上述循环后tempP大于1,说明它本身是一个质数,应该添加到因子中。
我们将变量count初始化为0,它将存储互质数的计数。
我们迭代遍历从L到R的每个数字num,并检查它是否可以被集合factors中的任何一个因子整除。如果可以,我们将其标记为非互质。
完成所有数字的迭代后,将返回结果计数作为最终值。至于主函数,它使用指定的值初始化L、R和P。
然后我们使用提供的值调用countCoprimes函数,并将结果存储在result变量中。
最后,我们显示结果,即在L和R之间与P互质的数字的计数。
结论
在指定的范围L-R内计算互质数,并且满足特定值P,对于程序员来说是一个不错的挑战 - 但是在代码层面上,最佳的方法是什么?作为本文的一部分,我们深入研究了两个C++使用案例,这些案例在解决此类问题时提供了真正的效率。首先,通过迭代在目标区间内的所有值,并使用欧几里得算法检查这些数字是否匹配为互质数;另外,还有使用欧拉函数
.........................................................