You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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;
}

错误原因

  1. 参数传递错误:fun2的声明是int fun2(int a);,但定义需要两个参数,且调用时只传入了最大余数p,完全没传入原始整数n,导致函数逻辑基于错误的数值运行。
  2. break时机错误:即使参数正确,当前逻辑中找到第一个余数等于最大值p的除数时,直接执行break跳出循环,但此时还未将当前除数i赋值给d,导致返回的d是上一次循环的i值。比如输入5时,i=3时余数为2等于p,此时直接break,d还是上一次的2。
  3. 逻辑冗余: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;
}

修复说明

  1. 修正参数逻辑:调整fun2的声明与调用,传入原始整数n和最大余数p,确保函数基于正确的数值计算。
  2. 调整break逻辑:移除多余的c变量,直接判断n%i == p,找到符合条件的除数就更新divisor,遍历完所有数后返回最后一个符合条件的除数(若有多个除数能产生最大余数,比如n=6时,余数3对应除数4和5,返回5更合理)。
  3. 简化代码结构:移除fun1中多余的参数,让逻辑更简洁清晰。

测试输入5时,修复后的代码会输出2 3,符合期望。

内容的提问来源于stack exchange,提问作者Anirudh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:54:19