题
我正在尝试解决Euler#9项目,这是 http://projecteuler.net/index.php?section=problems&id=9.
我已经浏览了此代码,逻辑似乎是对的……但是我没有得到 任何 完全输出,甚至没有循环中的printfs。我(显然)是一个新手,试图从更高级别的语言中学习……您能告诉我出了什么问题吗?
#include <stdio.h>
int main(){
unsigned int a=0, b=0, c=0;
short int pass=0;
while(!pass){
//printf("a = %4d\n", a);
a++;
b=a;
while(!pass){
b++;
c=1000-a-b;
if(b>=c) break;
if(a*a+b*b==c*c) pass = 1;
}
}
printf("a=%d, b=%d, c=%d, a*b*c=%d, a+b+c=%d\n", a, b, c, a*b*c,a+b+c);
return 1;
}
非常感谢。
编辑: 好的,我已将浮点问题解决如上所示,但是现在由于某种原因从未超过两个,使其无限地循环。
编辑: 我修复了一些错误,但仍然返回 a=33, b=483, c=484, a*b*c=7714476, a+b+c=1000
, ,这不太正确。 :(
哇,我过度复杂化了。它现在起作用。谢谢大家。
解决方案
if(floor(sc) != sc) continue; // we only want integer values of c
有可能 floor(sc)
总是很不满意 sc
. 。因为SC是双重的,因此对其进行操作将引入小错误。尝试定义一个小变量以表示“足够接近”,并检查它是否在该范围内。看 这里 围绕此策略。
不确定您的代码是否还有其他问题。
其他提示
不要使用 ==
或者 !=
. 。浮点号可以在您身上播放各种技巧。相反,尝试检查是否 sc
在整数附近的某些范围很小,您将有更好的运气。
项目Euler问题#9不需要方形根或漂浮。
当内循环的第一个通过中的第一个通过(因为√5不是整数)中的值'a = 1','b = 2'时,循环又回复了,'a = 1'和'b = 3',并且失败,因为√10不是整数,实际上,除了零(从循环中排除在外)以外,没有其他值的值2 + 12)本身就是一个整数。
因此,直到您用完了可分开的单独整数值的范围,您的代码将继续运行。
与“通过”和条件有关的代码 if(b>=c) break;
(甚至更)if( (a-- + b-- + c) == 7) pass=1;
完全难以理解。更清楚地将代码重写。我什至不会尝试猜测那做什么。我想它旨在限制范围,以使“ A + B + C”不大于7或其他范围,但我认为它不会实现所需的效果 - 即使您必须执行它。
引用项目Euler页面,您打算找到一个毕达哥拉斯的三胞胎'a,b,c',这样“ a <b <c”和“ a + b + c = 1000”。 1000因子未出现在您的程序中。给定A和B的值,确定C的相关值。