C программа на пифагорейских триплетах - неверный вывод
Я хочу взять каждую комбинацию чисел от 1 до 30,a и b, и хочу выяснить их пифагорейские тройки. Ограничение составляет 30 для ВСЕХ чисел. Выходные данные начинаются с 14. Я не понимаю, почему. Я действительно сожалею о любых грубые ошибки или ошибки формата. Я только начал C. Спасибо:)
#include<stdio.h>
#include<math.h>
int main()
{
float k;
int i,j,sum;
for(i=1;i<=30;i++)
{
for(j=1;j<=30;j++)
{
sum=(i*i)+(j*j);
k=sqrt(sum);
if(k>30.0)
{
break;
}
printf("Pythagorean Triplets are %d,%d,%f \n",i,j,k);
}
}
return 0;
}
1 ответ
Как Джонатан Леффлер уже писал в комментариях, нужно проверить на равенство i*i + j*j == k*k
, Вы не можете не делать это напрямую, потому что f
это поплавок и i,j
являются целыми числами, вам нужно, чтобы они были целого типа данных. Не большая проблема, просто сделайте что-нибудь в линии
#include <stdio.h>
#include <math.h>
int main(void)
{
float k;
int i, j, sum, k2;
for (i = 1; i <= 30; i++) {
for (j = 1; j <= 30; j++) {
sum = (i * i) + (j * j);
// you have "float k", hence "sqrtf()" instead of "sqrt()"
// which is for "double"s
k = sqrtf(sum);
// floating point numbers with any notes are "double"s,
// hence the "F" at the end
if (k > 30.0F) {
break;
}
// this may not work for very large values but you have 30
// as your upper limit which is low enough
k2 = (int) floorf(k);
if (k2 * k2 == sum) {
// use 2 digits for the format, makes it a bit more readable
printf("Pythagorean Triplets are %2d, %2d, %2d\n", i, j, k2);
}
}
}
return 0;
}
В противном случае обязательные проверки ошибок могут быть опущены здесь, потому что входные данные известны и, более того, известно, что они всегда действительны.
Но список все еще больше, чем ожидалось, он содержит дублеты, например: 3, 4, 5
а также 4, 3, 5
но я оставлю это как упражнение для ОП.