Определение пифагорейских троек заданного числа

Итак, школа началась, и я немного заржавел по своему кодированию, я пошел к своему профессору, и, по его словам, я близок, и я на несколько дюймов приблизился, я верю, но я застрял.

Назначение в основном для нас, чтобы понять, как использовать "Vi" в Linux, с небольшим назначением кодирования, сопровождающим его, чтобы мы могли кодировать в Vi.

Это то, что нам нужно сделать, попросить у пользователя положительное число, после того, как положительное число задано, нам нужно определить все пифагорейские тройки, которые возможны для чисел, вплоть до заданного числа.

Пока это то, что у меня есть...

#include <stdio.h>

int main(void)
{

    int x = 0, y = 0, z = 0, n;
    int count = 0;

    printf("Please Enter A Positive Integer: \n");
    scanf("%d", &n);

    while (z <= n)
    {
        while (y < z)
        {
            while (x < y)
            {
                if (x * x + y * y == z * z)
                {
                    printf("%d: \t%d %d %d\n", ++count, x, y, z);
                }
                x += 1;
            }
            y += 1;
        }
        z += 1;
    }

Теперь, если я введу что-нибудь 5 или выше, я получу правильную тройку "3 4 5"

Please Enter A Positive Integer: 25
1:  3 4 5

Но независимо от того, как высоко я иду, это так далеко, как я получаю какие-либо советы?

3 ответа

Решение

Вам нужно сбросить значения х и у во время каждого из ваших циклов:). Что у вас есть примерно так:

for(z = 0; z <=n; z++)
    for(; y < z; y++)
        for(; x < y; x++)

Вместо этого вам нужно сбрасывать x и y каждый раз, когда достигаются их циклы, поэтому:

while(z <= n) {
    y = 0;
    while(y < z) {
        x = 0;
        //...

Сделайте небольшую отладку. Добавьте условие else в ваш пифагорейский тест, чтобы увидеть, какие значения вы на самом деле тестируете;

if (x * x + y * y == z *  {
    printf("%d: \t%d %d %d\n", ++count, x, y, z);
} else {
    printf("NOT PYTH: %d: \t%d %d %d\n", ++count, x, y, z);
}

Это приведет вас к вашей проблеме.

Вы не сбрасываете x а также y в 0 на последующих итерациях внешних циклов. Вы можете подумать о for петли вместо while петли.

for (z = 0; z <= n; z++)
{
    for (y = 0; y < z; y++)
    {
        for (x = 0; x < y; x++)
        {
            if (x * x + y * y == z * z)
            {
                printf("%d: \t%d %d %d\n", ++count, x, y, z);
            }
        }
    }
}
Другие вопросы по тегам