求n除以1~n的最大余数及对应除数:C++代码fun2返回错误排查
问题分析与修复方案
问题描述
需要实现功能:给定整数n,找出n除以1到n之间任意整数时的最大余数,以及产生该余数的除数。现有C++代码中,fun1能正确返回最大余数,但fun2在输入为5时,本该返回除数3,实际却返回2,错误根源在于break语句的时机及参数传递问题。
- 输入示例:5
- 期望输出:2 3
- 当前输出:2 2
原始代码
#include <iostream> #include <algorithm> using namespace std; int fun2(int a); int fun1(int n ,int num); int main(){ int n = 0; int num = 0;; cin >> n; int p = fun1(n, num); cout << p << "\n"; cout << fun2(p); } int fun1(int n, int num){ int b = 0; for(int i = 1; i <= n; i++){ num = n % i; b = max(num, b); } return b; } int fun2(int n,int p ){ int num = 0; int c = 0; int d = 0; for(int i = 1; i <= n; i++){ num = n % i; c = max(num, c); if(c == p){ break; } d = i; } return d; }
错误原因
- 参数传递错误:
fun2的声明是int fun2(int a);,但定义需要两个参数,且调用时只传入了最大余数p,完全没传入原始整数n,导致函数逻辑基于错误的数值运行。 - break时机错误:即使参数正确,当前逻辑中找到第一个余数等于最大值
p的除数时,直接执行break跳出循环,但此时还未将当前除数i赋值给d,导致返回的d是上一次循环的i值。比如输入5时,i=3时余数为2等于p,此时直接break,d还是上一次的2。 - 逻辑冗余:
fun2中c = max(num, c)属于多余操作,因为我们已经知道最大余数是p,只需找到满足n%i == p的除数即可。
修复后的代码
#include <iostream> #include <algorithm> using namespace std; // 修正函数声明,明确需要的参数 int fun2(int n, int p); int fun1(int n); int main(){ int n = 0; cin >> n; int max_remainder = fun1(n); cout << max_remainder << " "; // 传入原始n和最大余数p cout << fun2(n, max_remainder) << endl; } // 简化fun1,移除多余参数 int fun1(int n){ int max_r = 0; for(int i = 1; i <= n; i++){ int current_r = n % i; max_r = max(current_r, max_r); } return max_r; } int fun2(int n, int p ){ int divisor = 0; // 遍历寻找所有满足条件的除数,保留最后一个(若有多个) for(int i = 1; i <= n; i++){ if(n % i == p){ divisor = i; } } return divisor; }
修复说明
- 修正参数逻辑:调整
fun2的声明与调用,传入原始整数n和最大余数p,确保函数基于正确的数值计算。 - 调整break逻辑:移除多余的
c变量,直接判断n%i == p,找到符合条件的除数就更新divisor,遍历完所有数后返回最后一个符合条件的除数(若有多个除数能产生最大余数,比如n=6时,余数3对应除数4和5,返回5更合理)。 - 简化代码结构:移除
fun1中多余的参数,让逻辑更简洁清晰。
测试输入5时,修复后的代码会输出2 3,符合期望。
内容的提问来源于stack exchange,提问作者Anirudh
相关产品推荐
相关产品推荐

