C语言for循环代码编译报错及输出结果异常求助
问题解析与修复方案
一、编译报错:_main符号未定义
C语言程序必须以main函数作为执行入口,你的初始代码仅定义了PSR函数,缺少程序启动的入口点,导致链接器无法找到_main符号,从而抛出arm64架构下的链接错误。添加main函数后,程序拥有了合法的执行入口,编译链接自然通过,这部分你已经正确完成修复。
二、PSR函数结果不符合预期
当前逻辑问题
你的PSR函数逻辑是遍历1到199的整数,记录最后一个能整除输入值n的数——也就是小于200的最大约数。对于3102来说,141是它的约数(141×22=3102),且141<200,是该范围内最大的约数,所以函数返回141是当前逻辑的正确结果,但这和你预期的47不符,说明函数逻辑未匹配你的实际需求。
从你注释里的sqrt代码推测,你大概率是想找小于等于√n的最大约数(或n的最大质因数)。3102的平方根约为55.7,小于等于该值的最大约数正是47,符合你的预期。
修复方案
方案1:找小于等于√n的最大约数
修改循环范围为从1到√n,遍历过程中记录最大的能整除n的数:
#include <stdio.h> #include <math.h> int PSR(int n) { int psr = 1; int sqrt_n = (int)sqrt(n); // 计算n的平方根作为循环上限 for (int i = 1; i <= sqrt_n; i++) { if (n % i == 0) { psr = i; // 因i递增,最后一次匹配的就是范围内最大约数 } } return psr; } int main() { printf("%d", PSR(3102)); // 输出47,符合预期 }
方案2:找n的最大质因数
如果你的需求是获取n的最大质因数,需要添加质数判断逻辑:
#include <stdio.h> #include <math.h> // 判断一个数是否为质数 int is_prime(int num) { if (num <= 1) return 0; if (num == 2) return 1; if (num % 2 == 0) return 0; int sqrt_num = (int)sqrt(num); for (int i = 3; i <= sqrt_num; i += 2) { if (num % i == 0) return 0; } return 1; } int PSR(int n) { int psr = 1; int sqrt_n = (int)sqrt(n); for (int i = 1; i <= sqrt_n; i++) { if (n % i == 0) { // 检查当前约数i是否为质数且更大 if (is_prime(i) && i > psr) { psr = i; } // 检查对应配对约数n/i是否为质数且更大 int other_divisor = n / i; if (is_prime(other_divisor) && other_divisor > psr) { psr = other_divisor; } } } return psr; } int main() { printf("%d", PSR(3102)); // 输出47,符合预期 }
内容的提问来源于stack exchange,提问作者Jacob Ivanov
相关产品推荐
相关产品推荐

