问题是找到可以被 17 和 32 整除且平方根大于 120 的最小偶数。
此代码输出 32,这显然不是真的。任何人都可以发现我的错误吗?
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int main()
{
int i = 1;
if(i%2!=0){
i++;
}
while(i%17!=0 && i%32!=0 && sqrt(i)<120){
i+=2;
}
cout<<i<<endl;
}
i%17!=0 && i%32!=0 && sqrt(i)<120
这就是问题所在。您的停止条件应为:
而(它不是(可被 17 整除,可被 18 整除,其根大于 120))。
这等于:
while(!(i%17==0 && i%32==0 && sqrt(i)>120))
甚至更短地使用德摩根定律:
while(i%17!=0 || i%32!=0 || sqrt(i)<=120)
你的布尔表达式是错误的。您需要在任何条件为真时循环,因为它必须在 i % 17 == 0、i % 32 == 0 或 sqrt(i) <= 120 时结束。对此的否定是一个 or'd 表达式。
答案是
#include <math.h> /* ceil */
#include <iostream>
int main ()
{
std::cout<<ceil((120*120)/(32*17))*(32*17);
}
不要对简单的数学问题使用循环
为了提高效率,你应该从 LCM 的 17 和 32 开始,即 544,然后逐步上升,而不是从 1 开始。