wwwgxd 2024-02-10 13:08 采纳率: 100%
浏览 4
已结题

关于C++for循环的一些

C++新手写一道验证题:n的三次方能写成任意连续奇数和,碰到了点循环的问题

int main() {
    int n = 0,s=0;
    cout << "给我一个自然数:" << endl;
    cin >> n;
    for (int i = 1,j=1; ; i++) 
    {
        for (;s<=n*n*n; j++) 
        {
            s = (i + j - 1) * j;
            cout <<s<<endl;//停不下来
            if (s == n * n * n)
                break;
            
        }
        if (s == n * n * n){
            for (int m=i;m<=i + 2 * (j - 1);m+=2)
            {
                cout << m<<" ";
            }
            break;
        }
        s = 0, j = 1;
    }
    
    return 0;
}
这是我第一次写的代码,几天后再看我觉得
```c++
if (s == n * n * n)
                break;

可以删掉,因为在e2那已经有个限制条件了,结果发现这样就停不下来了。
还有一个问题就是我将第一个内置for循环写成这种形式也是无限循环

for (int s=0;s<=n*n*n; j++) 

想问一下各位是哪里出了问题

  • 写回答

4条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-10 13:09
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    你的代码中存在一些逻辑问题,我将逐个为你解答。

    首先,关于你提到的能否删除 if (s == n * n * n) break; 这一行的问题,答案是不能。在内部循环中,即使有 s <= n * n * n 的限制条件,也需要这个判断来跳出找到正确解的情况。否则,在找到符合条件的 s 后,程序会继续执行下一个 j 的迭代,而不是跳出整个嵌套循环。

    其次,原始代码中的第一个 for 循环没有问题:

    for (int i = 1, j = 1; ; i++)
    

    这里的无限循环设计是合理的,因为它依赖内部循环和后续的判断来决定何时跳出。

    然而,你提到的修改后会导致无限循环的代码片段:

    for (int s = 0; s <= n * n * n; j++)
    

    这里的问题在于,你在循环条件里使用了变量 s,但在循环体里没有对 s 进行更新,而更新 s 的语句是在内部循环里的。这样就会导致 s 的值永远无法满足循环结束条件,从而造成无限循环。

    正确的做法应该是保留原有的两个嵌套循环结构,并修正内部循环的控制变量,例如这样:

    #include <iostream>
    using namespace std;
    
    int main() {
        int n, s = 0;
        cout << "给我一个自然数:" << endl;
        cin >> n;
    
        for (int i = 1; ; i++) {
            s = 0;
            for (int j = 1; s <= n * n * n; j++) {
                s += (2 * j - 1); // 直接累加奇数
                if (s == n * n * n) {
                    cout << n << "的三次方可以表示为连续奇数之和:";
                    for (int m = i; m <= i + 2 * (j - 1); m += 2) {
                        cout << m << " ";
                    }
                    cout << endl;
                    return 0;
                }
            }
        }
    
        return 0;
    }
    

    上述代码已进行简化和修正,使得当找到符合条件的连续奇数之和时输出结果并退出程序。同时,内部循环计算连续奇数之和的方式也做了优化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月18日
  • 已采纳回答 2月10日
  • 创建了问题 2月10日

悬赏问题

  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼
  • ¥15 关于将inet引入的相关问题
  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP