Znaleźć liczby spełniające warunek 1/x*x + 1/y*y = 1/z*z

0

Znaleźć liczby spełniające warunek 1/xx + 1/yy = 1/z*z.

 #include <stdio.h>
#include <stdlib.h>

int main() 
{
	int a, b, c;
	const int N = 50;
	
	printf("  a   b   c\n\n");
	
	for(a = 1; a <= N; a++)
	{
		for(b = 1; b <= N; b++) 
		{
			for(c = 1; c <= N; c++)
				if(a*a + b*b == c*c) 
					printf("%3i %3i %3i \n", a, b, c); //3 miejsca po lewej
		}
	}

	//Podpunkt B
	printf("\n\nPodpunkt b: ");
	printf("\n1/x^2 + 1/y^2 = 1/z^2");
	printf("\n  x   y   z\n\n");
	
	for(a = 1; a <= N; a++)
	{
		for(b = 1; b <= N; b++) 
		{
			for(c = 1; c <= N; c++)
				if((float)1/a*a + (float)1/b*b == (float)1/c*c) 
					printf("%3.2f %3.2f %3.2f \n", a, b, c); //3 miejsca po lewej
		}
	}
	printf("\n");
	system("PAUSE");
	return 0;
}

Pytanie tam gdzie jest podpunkt B, dlaczego z tej pętli nie są wypisywane żadne liczby ? Co jest źle ?

0

porównaj obrazki:
printf("%3i %3i %3i \n", a, b, c); //3 miejsca po lewej
printf("%3.2f %3.2f %3.2f \n", a, b, c); //3 miejsca po lewej

a, jeszcze, a może przede wszystkim if((float)1/a*a + (float)1/b*b == (float)1/c*c) - ze względu na błędy zaokrągleń liczb zmiennoprzecinkowych nie porównuje się w taki sposób. zamiast x == y robi się abs(x - y) < eps, gdzie eps to żądana dokładność obliczeń, jak dla Ciebie eps to np. coś >= od 10^-3 (0.001).

0

źle jest to, że tak nie wolno porównywać liczb zmiennoprzecinkowych! 1/a*a nie da ci dokładnego wyniku, bo maszyna ma skończoną dokładność, więc coś niedokładnego + coś niedokładnego nie można dosłownie porównywać z czymś równie niedokładnym, bo prawie na pewno wyjdzie to różne z powodu braku dokładności.
Przykład: zapisz dokładnie 1/3 stosując skończoną liczbę cyfr (rozmiar float) w zapisie dziesiętnym: 0.333333333333333..... - nie da się. Tu masz ten sam problem tyle, że w systemie binarnym.

Przekształć wzór i zrób to na liczbach całkowitych:
zz=xxyy/(xx+yy)
tylko nie zapomnij o reszcie z dzielenia!

1 użytkowników online, w tym zalogowanych: 0, gości: 1