只要l为1且h可以是任何数字,此循环就起作用。但我需要它从不同的范围工作,如l = 20 h = 40?谁能告诉我怎么做?我将不胜感激。
#include <iostream>
#include <vector>
#include <list>
#include <math.h>
#include <algorithm>
using namespace std;
int main(void)
{
int a, b, c, i = 0;
unsigned long l = 1;
unsigned long h = 25;
int array[3];
for ( a = l; l <= a && a <= h; ++a )
for ( b = a; l <= b && b <= h; ++b )
for ( c = b; l < c && c <= h; ++c )
if ( a * a + b * b == c * c )
{
array[0] = a;
array[1] = b;
array[2] = c;
if (array[0]+array[1]+array[2] <= h)
cout << array[0] << " " << array[1] << " " << array[2] <<endl;
else
break;
}
return 0;
}
答案 0 :(得分:3)
如果我理解你的话,那你就是在试图强迫Diophant的系统
这是解决方案
#include <iostream>
using namespace std;
int main() {
const int l = 1;
const int h = 25;
for ( int a = l; a <= h; ++a )
for ( int b = l; b <= h; ++b )
for ( int c = l; c <= h; ++c )
if ((a * a + b * b == c * c ) &&
(a + b + c <= h))
cout << a << " " << b << " " << c <<endl;
return 0;
}
输出是:
3 4 5
4 3 5
6 8 10
8 6 10
如果你不需要区分a和b,第二个循环可能是
for ( int b = a; b <= h; ++b )
所以你会得到这个:
3 4 5
6 8 10
答案 1 :(得分:2)
这条线路有一些有趣的东西,我不知道你要做什么......
for ( a = l; l <= a && a <= h; ++a )
因此,在第一轮a=l
,a++
,并检查条件l<=a
。 a
将为l+1
,这意味着l<=l+1
,因此您将在第一次之后退出循环。我怀疑这不是你想要的行为,但我真的不知道你想做什么。我可以推测你想要这样的东西:
for ( a = 0; l <= a && a <= h; ++a )
编辑:从您的评论中,我可以看到您正在尝试做什么,这应该会更好。基本上,您不需要具有较低值的条件,它是您的问题的根源。此外,我不明白为什么你懒得把值放到一个数组中,每次都写出来,所以我把它删除了。
for ( a = l; a <= h; ++a ) {
for ( b = a; b <= h; ++b ) {
for ( c = b; c <= h; ++c ) {
if ( a * a + b * b == c * c ) {
if (a+b+c <= h) {
cout << a << " " << b << " " << c <<endl;
}
else {
break;
}
}
}
}
}
答案 2 :(得分:1)
我认为一个问题出现在你的第三个循环中,这与其他两个循环略有不同:
for ( c = b; l < c && c <= h; ++c ) {
在第一次传递时,a == 1
和b == 1
以及l == 1
因此c
设置为1,而l < c
的计算结果为false,因此内循环不执行。
你真的不需要测试你的下界(早期循环中的l < c
或l <= b
等),因为你从你设置的方式知道条件应该是真的,除非你在这种情况下打错了。
C ++中for循环的规范形式是:
for (int i = lo; i < hi; ++i)
对于合适的类型(此处为int
),索引变量(i
)从下限lo
开始,但不包括上限hi
。这也适用于C99,但不适用于C89。如果在循环完成后需要循环索引的值,那么可能在更大的范围内声明变量,而不仅仅是如图所示的循环,但是你通常会避免这样做。 (我在注释中使用了i++
,因为我是一个未经过改编的C程序员,但一般来说,在C ++中预增量更好。)
答案 3 :(得分:0)
在第一次循环时,条件将从第一次开始为假,因为l> a