C语言实现欧拉函数输出为0,如何修改is_coprime与euler函数?
问题排查与修正方案
你的代码存在三个核心问题,仅调整is_prime(原计划命名is_coprime)和euler函数即可解决:
is_prime函数无返回值:函数声明为int返回类型,但未写return语句,调用时返回随机值,永远不满足等于1的判断条件,导致sum始终为0- 互质判断逻辑缺失:欧几里得算法执行完成后,最终变量m是两数的最大公约数,需要返回
m == 1的布尔结果作为互质判断依据 euler函数遍历起始值错误:欧拉函数统计的是1到n范围内和n互质的正整数个数,你从i=0开始遍历无意义,应调整起始值为1
修正后的代码(仅调整两个目标函数,main函数完全不变)
#include <stdio.h> int is_prime(int m, int n) { int r; while (n > 0) { r = m % n; m = n; n = r; if (m == 1) break; } // 补充互质判断返回逻辑 return m == 1 ? 1 : 0; } int euler(int n) { int i; int sum = 0; // 调整遍历起始值为1 for (i = 1; i <= n; i++) { if (is_prime(i, n) == 1) sum += 1; } return sum; } main() { int i; for (i = 2; i <= 10; i++) { printf("euler(%d) = %d\n", i, euler(i)); } }
内容的提问来源于stack exchange,提问作者wannabe
相关产品推荐
相关产品推荐

