带有 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
我正在学习编码基础知识,并且不得不编写一个代码来计算如果每个级别都是平方的(例如第 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