bool prime_pairs(int x, int y) {
int t = 0;
while (y != 0) {
t = y;
y = x % y;
x = t;
}
return (x == 1);
}
void proer_fractions(int n) {
int num = n % 2 == 0 ? n / 2 - 1 : n / 2, den = 0, count = 0;
for (; num > 0; --num) {
den = n - num;
if (prime_pairs(num, den))
++count;
}
printf("%d", count);
}
我想知道我是否做得对。无论如何加速算法?当N = 50 000 000时,我的笔记本电脑(i7-4700mq)以2.97秒的速度运行,处于释放模式。
非常感谢。
答案 0 :(得分:1)
关键的事实是,如果p + q = n
和gcd(p, q) = k
则k必须除以n。相反,如果p与n互质,则q = n - p
必须与p互译。
因此,计算总和为n的互质对(p,q)的问题有效地减少到计算与n(Euler's totient,又名为phi)相互作用的数字并将该数除以2。
有很多代码可以在网上计算一个数字的总数,就像GeeksForGeeks的文章Euler's Totient Function一样。它基本上归结为对数字进行分解,这应该比您当前的算法快得多(大约5个数量级)。玩得开心!