问题是:
毕达哥拉斯三元组是一组三个自然数,a< b< C, 为此,a ^ 2 + b ^ 2 = c ^ 2例如,3 ^ 2 + 4 ^ 2 = 9 + 16 = 25 = 5 ^ 2.
恰好存在一个毕达哥拉斯三重态,其中a + b + c = 1000.找到产品abc。
因此使用函数tripletP()我认为该程序为数字1000生成3个加法器的所有可能组合。 并且函数isTriplet(a,b,c)在这段代码中,永远不会返回true,并且int product的值最后为0。 我似乎无法找到我的逻辑中的缺陷,任何帮助都会受到赞赏。
这是我的Java类,其代码我认为可以解决问题9:
public class ProblemNine {
public static void main(String[] args) {
ProblemNine f = new ProblemNine();
System.out.println(f.tripletP());
}
boolean isTriplet(int a, int b, int c){
if((a*a)+(b*b)==(c*c)){
return true;
} else return false;
}
int tripletP(){
int a=1,b=2,c=997;
int product = 0;
//outerloop generates all possible combinations of 3 summators for the number 1000, if b>c>a is true
outerloop:
for(int i = 997; i>499; i--){
c = i;
b = 999-i;
a = 1;
while(b>(a+2) && (a+b) == (1000-i) && a!=b && c>b){
b--;
a++;
// supposedly checks if a,b,c are a triplet.
if (isTriplet(a,b,c)){
product=a*b*c;
break outerloop;
}
}
if(c>997 || b>499 || a>249){
break outerloop;
}
}
return product;
}
}
答案 0 :(得分:2)
for(int i = 997; i>499; i--){
你太早停止了。如果a<b<c
和a+b+c == 1000
,c的最小可能值不是500,则为335。
for(int i = 997; i>335; i--){
有了这个新的下限,b
偶尔会大于c
,这会过早地触发你的一些条件。但是,你可以删除它们并仍然得到正确的答案。
for(int i = 997; i>335; i--){
c = i;
b = 999-i;
a = 1;
while(b>(a+2)){
b--;
a++;
if (isTriplet(a,b,c)){
product=a*b*c;
break outerloop;
}
}
}