в этом коде есть ошибки. Сначала вы должны выделить память для int*array;
, взяв int arraySize;
в качестве входных данных, вы можете сделать это следующим образом
array = malloc(sizeof(int) * arraySize);
, тогда здесь %p
не подходит, вместо этого используйте %d
. Посмотрите здесь для получения дополнительной информации о %p
% p спецификаторе формата , а также, поскольку вы хотите напечатать 2 позиции, вам нужно вызвать два аргумента в printf
, например, printf("The positions are: %d %d", positions[0], positions[1]);
В вашей функции twoSum
вам нужно выделить память для int* returnSize ;
следующим образом returnSize = malloc(sizeof(int) * 2);
, и здесь вы не возвращаете позиции найденных элементов, вы сами возвращаете элементы.
if(sum==target){
returnSize[0]=nums[i];
returnSize[1]=nums[j];
}
также вам нужно добавить return
в этом if-statement
другом случае, вы полностью пройдете массив, и returnSize
элементы снова станут -1
(если ответ не является слишком последним элементом массива)
так что if
должно быть таким:
if (sum == target) {
returnSize[0] = i;//num[i] is not position. it is element of array
returnSize[1] = j;//num[j] is not position .it is element of array
return returnSize;//otherwise it will traverse array compeltely and they -1 again
}
также только если вы кодируете одну строку для if,else,while,for,...
(условные операторы), вы можете избежать использования фигурных скобок, в противном случае только одна строка вашего кода будет выполняется, если это условие становится истинным, поэтому вы должны добавить блок для этого else
:
else
{
returnSize[0] = -1;
returnSize[1] = -1;
}//coding more than one line so your else should be in a block
, а также здесь sum=sum+num[i]+num[j];
неверно, вы должны изменить это на sum=num[i]+num[j];
, потому что вы хотите только проверить сумму в два o текущий номер или, что лучше, вообще не используйте сумму, только проверьте равенство цели с num[i]+num[j]
, вот полный код:
int* twoSum(int* nums, int numsSize, int target);
int main() {
int* array;
int arraySize;
scanf("%d", &arraySize);
array = malloc(sizeof(int) * arraySize);//allocate memory for array
for (int i = 0; i < arraySize; i++) {
scanf("%d", &array[i]);
}
int target;
scanf("%d", &target);
int* positions = twoSum(array, arraySize, target);
printf("The positions are: %d %d", positions[0], positions[1]);//%p is for not for content of array
return 0;
}
int* twoSum(int* nums, int numsSize, int target) {
int* returnSize ;
returnSize = malloc(sizeof(int) * 2);
for (int i = 0; i < numsSize; i++) {
for (int j = 0; j < numsSize; j++) {
if (nums[i] + nums[j] == target) {
returnSize[0] = i;//num[i] is not position. it is element of array
returnSize[1] = j;//num[j] is not position .it is element of array
return returnSize;//otherwise it will traverse array compeltely and they -1 again
}
else
{
returnSize[0] = -1;
returnSize[1] = -1;
}//coding more than one line so your else should be in a block
}
}
return returnSize;
}