哪儿错了?编一程序求最大整数n,使得: 1+(1+2)+(1+2+3)+.+(1+2+3+.n)<=m (m为小于32768的正整数)。

编一程序求最大整数n,使得:
1+(1+2)+(1+2+3)+.+(1+2+3+.+n)<=m (m为小于32768的正整数)。
输入
输入一个正整数m。(0<m<32768)
输出
一行,输出n的值,及1+(1+2)+(1+2+3)+.+(1+2+3+.+n)的值。


#include<bits/stdc++.h>
using namespace std;
int main(){
    int i,ans=0,m,a;
    cin>>m;
    for(i=1;;i++){
        int s=0;
        for(int j=1;j<=i;j++)
        s+=j;
        ans+=s;
        if(ans>m)break;
    }
    for(int j=1;j<=i;j++)
    a+=j;
    cout<<i-1<<" "<<ans-a;
    return 0;
}

你的程序接近正确,但有一些小错误。首先,你需要初始化变量 a,因为你在之后的循环中使用它来累积值。另外,条件 if (ans > m) 应该放在内层循环中,以确保不会超过 m。

以下是修复后的代码:

#include <iostream>
using namespace std;

int main() {
    int m;
    cin >> m;
    
    int n = 0;
    int sum = 0;
    int a = 0;

    while (true) {
        n++;
        a += n;
        sum += a;

        if (sum > m) {
            break;
        }
    }

    cout << n - 1 << " " << sum - a << endl;

    return 0;
}

这个程序会找到满足条件的最大整数 n,并输出 n 的值以及累加的结果。

a的值没有初始化为0
建议:break跳出判断ans>m,这里跳的话多算了一项,你通过减一项的操作代码健壮性不如直接到n就退出

【以下回答由 GPT 生成】

m = int(input("输入一个小于32768的正整数m: "))

n = 1
sum = 1

while (sum + (n+1)*(n+2)/2 <= m):
    n += 1
    sum += (n*(n+1))/2

print(n, sum)

以上代码使用一个循环来逐步增加n的值,直到满足条件1+(1+2)+(1+2+3)+...+(1+2+3+...+n) <= m为止。在每次循环中,计算新的n和sum的值。输出n和sum的最终结果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^