带有 pow 函数的 C++ "for" 循环给出了不正确的结果

C++ "for" loop with a pow function in it gives incorrect results

我正在学习编码基础知识,并且不得不编写一个代码来计算如果每个级别都是平方的(例如第 1=1、第 2=4),可以使用可用块“x”构建多少个金字塔级别, 3rd=9 等) 这是我到目前为止所拥有的,对于我的一生,我看不出我哪里错了,但是代码总是返回一个比它应该多的 2 的值(例如 x=25 应该导致 3 而不是 5)

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int i, x, y=0;
    cout<< "How many blocks do you have?"<< endl;
    cin>> x;
        for (i=1; y<=x; i++) {
            y=y+pow(i, 2);
            
        } cout<< i <<endl;

return 0;
}

编辑: 感谢您的回答。复制并试用它们,for 函数在这里似乎是更糟糕的选择,所以我最终使用了 while.

for 循环不正确

    for (i=1; y<=x; i++) {
        y=y+pow(i, 2);
        
    } 

这个表达式的结果

y=y+pow(i, 2);

可以大于x但i的值会增加

你可以用下面的方式编写 for 循环

    int tmp;

    for ( i = 0; ( tmp = pow(i + 1, 2) ) + y <=x; i++) {
        y += tmp;
        
    } 

这是因为您的 for 循环即使无法制作下一层也能正常工作,然后它会再次递增 i。这就是为什么您的结果比应有的结果大 2 的原因。试试这个:

int tmp;
while(true){
tmp = y+i*i;

if(tmp > x) //check if this layer is possible to create
    {
    i--; //its impossible , so answer is previous i 
    break;
    }
i+=1;
y = tmp;
} cout<< i <<endl;

如果您想让代码保持原样,此方法同样有效:

int i, x, y=1;  // y is now 1
cout<< "How many blocks do you have?"<< endl;
cin>> x;
for (i=2; y<=x; i++) {  // i now starts from 2
    y=y+pow(i, 2);

}
cout<<i-2<<endl; // now i-2