Найти (x, y) решения уравнения - PullRequest
0 голосов
/ 03 января 2019

Программа получает положительное число k от пользователя и должна проверить, сколько существует решений для уравнения

3*x+5*y=k

В случае многих решений функция принимает большее абсолютное значение |x-y| всех решений. Если есть только одно решение, оно печатает его. Например:

  • Если пользователь вводит k=34, существует два решения для (x,y): (3,5) и (8,2). Следовательно, есть два решения, которые программа вычисляет |8-2| и |3-5| и принимает большее, 6.

  • Если пользователь, например, набирает k=8, есть только одно решение, (1,1).

К сожалению, мой учитель попросил меня использовать только циклы, операторы if и else. Нет рекурсии, нет вспомогательных функций и нет массивов. Она также хочет, чтобы программа была эффективной, поэтому я не могу использовать цикл внутри цикла.

Я пытался написать код, но программа не отвечает. Я определил counter для подсчета количества возможных решений для уравнения и distance большее абсолютное значение:

void check_how_many_solutions(int n) {
    int  y = 0, counter = 0, distance = 0, equation1 = 0, equation2 = 0, equation3 = 0; 
    while (equation3 <= n) {
        equation1 = (n - (5 * y)) / 3;
        equation2 = (n - (3 * equation1)) / 5; 
        equation3 = (3 * equation1) + (5 * equation2);
        if (equation3 == n) { 
            counter++;  
            if (fabs(equation1 - equation2) > distance)
                distance = fabs(equation1 - equation2);
        }
        y++;
    }   
    if (counter > 1)
        printf("The values of x and y are (%d,%d)\n", equation1, equation2); 
    else
        printf("The greater absolute value of |x-y| is %d\n", distance);
}

Код работает, но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

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

В настоящее время ваш код работает бесконечно.Попробуйте выполнить всего несколько итераций вашего кода и распечатать переменные и посмотреть, имеют ли они смысл для каждой итерации.Вот ваш упрощенный код, цикл ограничен 20 итерациями и печать переменных в каждой итерации:

void check_how_many_solutions(int n) {
    int  y = 0, counter = 0, distance = 0, equation1 = 0, equation2 = 0, equation3 = 0; 
    while( y < 20){
    //while (equation3 <= n) {
        equation1 = (n - (5 * y)) / 3;
        equation2 = (n - (3 * equation1)) / 5; 
        equation3 = (3 * equation1) + (5 * equation2);
        printf("y: %i, equation1: %i, equation2: %i, equation3: %i\n",y,equation1,equation2,equation3);
        y++;
    }   
}
0 голосов
/ 03 января 2019

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

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

void count_solns(double);

int main(int argc, char *argv[])
{
    if (argc == 2 && argv[1]) {
        int k = atoi(argv[1]);
        count_solns(k);
    }
    else {
        puts("Usage: count_solns <positive_integer>");
        return 1;
    }
    return 0;
}

void count_solns(double k)
{
    printf("Print positive integer solutions to 3x + 5y = %.3f\n", k);
    int solns_found = 0;
    int distance = -1;
    int final_x, final_y;
    double x, y;
    for (x = 0; x <= (k/3); x++) {
        y = (k-3*x)/5;
        if (y == floor(y)) {
            printf("Solution found at (x, y) == (%d, %d)\n", (int) x, (int) y);
            solns_found++;
            if (fabs(x-y) > distance) {
                final_x = x;
                final_y = y;
            }
        }
    }
    if (solns_found == 0)
        printf("No whole number solutions found for 3x + 5y = %.3f", k);
    else if (solns_found == 1)
        puts("This is the only solution where x and y are both whole numbers");
    else
        printf("The whole number solution with the highest distance between x and y is (x, y) == (%d, %d)", final_x, final_y);
    return;
}

Использование выглядит следующим образом:

$ ./count_solns 70
Print positive integer solutions to 3x + 5y = 70.000
Solution found at (x, y) == (0, 14)
Solution found at (x, y) == (5, 11)
Solution found at (x, y) == (10, 8)
Solution found at (x, y) == (15, 5)
Solution found at (x, y) == (20, 2)
The solution with the highest distance between x and y is (x, y) == (20, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...