Вы ищете функцию, которая определяет, можно ли записать число как сумму двух кубов, и если да, то она должна дать два числа, кубики которых суммируются. В основном вам нужно:
- информация о том, можно ли
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
.
При распределении памяти убедитесь, что достаточно места для желаемого типа. Также не используйте указатели free
d; память, на которую они указывают, недействительна.
person
M Oehm
schedule
15.11.2015
malloc(2)
выделяет 2 байта; вам нужноmalloc(2 * sizeof(*numSet))
. Но если вам нужно 2 целых числа локально, почему бы не использовать автоматический массив? - person M Oehm   schedule 15.11.2015main
не может использовать блок памяти, если вы его уже освободили. - person user253751   schedule 15.11.2015=
- это присваивание, а не равенство. Вам необходимо заменить вашif (something = something)
наif (something == something)
. Ошибка новичка;) - person Luke Joshua Park   schedule 15.11.2015malloc
на C? Часто это делают абсолютные новички, что предполагает, что их этому учат их профессора ... OP, к сведению: stackoverflow.com/questions/605845/ - person user4520   schedule 15.11.2015a^3
не кубa
. Этоa*a*a
. (^
- это xor или исключающий или оператор в C.) - person M Oehm   schedule 15.11.2015declaring variables
иdeclaring array
совершенно бесполезны; ваши комментарии должны описывать, что функция делает на высоком уровне.a = a + 1;
эквивалентноa++
илиa += 1
. Вам не нужно сравнивать логическое значение с false, вы можете просто сделатьif (!result)
. - person Bobby Sacamano   schedule 15.11.2015