Распределение памяти в C и передача нескольких чисел

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

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

Вот что у меня есть:

int* f_cubes_sum(int n)
{
    //Declaring array
    int *numSet;
    numSet = (int *)malloc(2); // Only two because I'm looking for a pair
    //Declaring variables
    int sum = 0;
    int a = 0;
    int b = 0;
    bool results = false;



    while (b < n && results == false)
    {
        while (a < n)
        {
            sum = a^3 + b^3;
            if (sum == n)
            {
                results = true;
            }
            else
            {
                a = a + 1;
            }

            sum = 0;
        }

        if (results = false)
        {
            a = 0;
            b = b + 1;
        }
    }

    if (results = false)
    {
        a = NULL;
        b = NULL;

    }

    numSet[0] = a;
    numSet[1] = b;
    free(numSet);
    return numSet;
}

И как мне получить доступ к обоим номерам в моей основной функции?

Спасибо за уделенное время


person Ryan L    schedule 15.11.2015    source источник
comment
malloc(2) выделяет 2 байта; вам нужно malloc(2 * sizeof(*numSet)). Но если вам нужно 2 целых числа локально, почему бы не использовать автоматический массив?   -  person M Oehm    schedule 15.11.2015
comment
Вы не можете освободить выделенную память, а затем вернуть на нее указатель!   -  person Thomas Padron-McCarthy    schedule 15.11.2015
comment
Для начала main не может использовать блок памяти, если вы его уже освободили.   -  person user253751    schedule 15.11.2015
comment
Не уверен, что это вызывает вашу проблему, потому что я ее почти не читал, но в C = - это присваивание, а не равенство. Вам необходимо заменить ваш if (something = something) на if (something == something). Ошибка новичка;)   -  person Luke Joshua Park    schedule 15.11.2015
comment
Кто-нибудь знает, что случилось с тем, что все бросили результат malloc на C? Часто это делают абсолютные новички, что предполагает, что их этому учат их профессора ... OP, к сведению: stackoverflow.com/questions/605845/   -  person user4520    schedule 15.11.2015
comment
О, и a^3 не куб a. Это a*a*a. (^ - это xor или исключающий или оператор в C.)   -  person M Oehm    schedule 15.11.2015
comment
Это начинает походить на экзамен. Найдите в коде десять ошибок. Вы получаете по одному баллу за каждую обнаруженную ошибку.   -  person Thomas Padron-McCarthy    schedule 15.11.2015
comment
@szczurcio В моем университете этим занимаются два профессора. Я думаю, что многие люди, которые начали с C ++, просто предполагают, что C ++ - это надмножество C. Это заставляет меня немного передергивать, поскольку там нет stdlib.h. Надеюсь, это было в реальном коде.   -  person Bobby Sacamano    schedule 15.11.2015
comment
Просто чтобы вы знали, комментарии типа declaring variables и declaring array совершенно бесполезны; ваши комментарии должны описывать, что функция делает на высоком уровне. a = a + 1; эквивалентно a++ или a += 1. Вам не нужно сравнивать логическое значение с false, вы можете просто сделать if (!result).   -  person Bobby Sacamano    schedule 15.11.2015
comment
В частном случае возврата двух чисел возврат их в структуре может быть гораздо более эффективным.   -  person Basile Starynkevitch    schedule 16.11.2015


Ответы (1)


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

  • информация о том, можно ли n записать как a³ + b³ и
  • если да, то значения a и b.

Вы можете использовать свой подход: выделить массив из двух целых чисел и вернуть его в случае успеха и NULL в случае неудачи. Если вы это сделаете, вы должны выделить массив только в том случае, если у вас есть результат:

int *f_cubes_sum(int n)
{
    int a, b;

    // logic to work out whether a³ + b³ == n
    if (a*a*a + b*b*b == sum) {
        int *res = malloc(2 * sizeof(*res));

        res[0] = a;
        res[1] = b;

        return res;
    }

    // no solution found
    return NULL;
}

Недостатком здесь является то, что вызывающий код должен освободить возвращаемый указатель:

int *res = f_cubes_sum(2778);

if (res) {
    printf("%d, %d\n", res[0], res[1]);
    free(res);
}

Другой подход - передать массив, который должен заполнить ваш код, и указать успех или неудачу с помощью логического возвращаемого значения:

bool f_cubes_sum(int n, int res[2])
{
    int a, b;

    // logic to work out whether a³ + b³ == n
    if (a*a*a + b*b*b == sum) {
        res[0] = a;
        res[1] = b;

        return true;
    }

    // no solution found
    return false;
}

Теперь вызывающий код должен предоставить место для результата:

int res[2];

if (f_cubes_sum(2778, res)) {
    printf("%d, %d\n", res[0], res[1]);
}

Конечно, поскольку вы всегда имеете дело с двумя возможными значениями результата, вы также можете передавать указатели на эти значения вместо передачи массива. Вот вариант вашей функции, которая делает это:

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

bool f_cubes_sum(int n, int *pa, int *pb)
{
    int a = 0;

    while (1)
    {
        int a3 = a*a*a;

        if (a3 > n) break;

        int b = cbrt(n - a3) + 0.5;
        int b3 = b*b*b;

        if (a3 + b3 == n) {
            *pa = a;
            *pb = b;
            return true;
        }

        a++;
    }

    return false;
}

int main(void)
{
    int a, b;
    int n = 35001;

    if (f_cubes_sum(n, &a, &b)) {
        printf("%d^3 + %d^3 == %d\n", a, b, n);
    } else {
        printf("Nothing found for %d.\n", n);
    }

    return 0;
}

Также обратите внимание на то, что уже указали комментаторы:

  • В C = назначает, == сравнивает. К сожалению, присвоение внутри условия iF является допустимым. C: оно присваивает значение, а затем проверяет его, вводя предложение, если оно не равно 0 или false. Следовательно, if (x = false) никогда не входит в предложение if. Включите предупреждения, чтобы исправить такие ошибки.

  • Оператор ^ - это не оператор мощности, это побитовый оператор xor. Возведение числа a в степень b выполняется с помощью функции с плавающей запятой pow(a, b). Если показатель степени представляет собой известное малое целое число, обычно лучше записывать умножение явно. Таким образом, pow(a, 3) отображается лучше как a*a*a.

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

person M Oehm    schedule 15.11.2015
comment
Похоже на случайную проблему форматирования в третьем абзаце снизу (предпоследний абзац - для удобства Леффлера) - person David C. Rankin; 16.11.2015
comment
О да, эти надоедливые обратные цитаты. Обычно мне удается один или два человека наклониться не в ту сторону. И спасибо за исправление вызова функции. - person M Oehm; 16.11.2015