C получить нечетные числа между диапазоном и сохранить его в массиве int - PullRequest
0 голосов
/ 25 октября 2018

эта функция должна хранить нечетные числа от l до r включительно в массиве целых чисел.result_count для

  • Сохранить размер возвращаемого массива в переменной result_count
  • . Выделить массив статически или динамически.

Я не знаю, что делать внутри условия if.Я попробовал это:

int* oddNumbers(int l, int r, int* result_count) 
{
    int i;
    for (i = l; i <= r; i++)
    {
        if (i%2 == 1)
        {
            i = result_count[i];
        }
    }
    return result_count;
}

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

@ J.У хорошего ответа были некоторые проблемы с крайними и крайними случаями по следующим адресам.

#include <stdlib.h>

// Return the list of odd numbers and a count.
// With oddNumbers(INT_MIN, INT_MAX,...) the number of odd integers is INT_MAX + 1, 
// the result_count is saved as some type that supports value INT_MAX + 1 
// such as usually `unsigned`.
int *oddNumbers(int l, int r, unsigned* result_count) {
  // if l is even, start at l = l + 1
  // Cannot overflow as INT_MAX is odd
  l += !(l % 2);

  // The list is empty when left/right out of order. 
  if (l > r) {
    *result_count = 0;
    return NULL;
  }

  // if r is even, end at r = r - 1
  // When r even, decrement cannot overflow as r > INT_MIN due to prior code
  r -= !(r % 2);

  // allocate
  *result_count = ((unsigned) r - l) / 2 + 1;
  int *result = malloc(sizeof *result * *result_count);
  if (result == NULL) {
    return NULL;
  }

  // fill it
  result[0] = l;
  for (unsigned i = 1; i < *result_count; i++) {
    l += 2;  // do not add 2 until needed
    result[i] = l;
    // Adding +2 afterward risks UB of `INT_MAX + 2`.
  }

  return result;
}
0 голосов
/ 25 октября 2018
  • Сохранение размера возвращаемого массива в переменной result_count
  • Выделение массива статически или динамически.

Iперейти к динамически распределенному массиву.

#include <limits.h>
#include <stdlib.h>
#include <assert.h>

int* oddNumbers(int l, int r, int* result_count)
{
    int *result;
    int i;

    assert(result_count && l <= r && INT_MIN < r);

    l += !(l % 2);  // if l is even start at l = l + 1
    r -= !(r % 2);  // if r is even  end  at r = r - 1

    *result_count = (r - l) / 2 + 1;  // calculate array size
    result = malloc(*result_count * sizeof(*result));

    if(!result)
        return NULL;

    // fill it
    for (i = 0; l <= r; ++i, l += 2)
        result[i] = l;

    return result;
}

Использование:

#include <stdio.h>

int main(void)
{
    int min = 42;
    int max = 85;
    int count;
    int *numbers = oddNumbers(min, max, &count);
    int i;

    if(count && !numbers) {
        printf("There are %d odd numbers between %d and %d, "
               "but not enough memory to allocate an array of that size :(\n\n",
               count, min, max );
        return EXIT_FAILURE;
    }

    printf("Number count: %d\n", count);

    for (i = 0; i < count; ++i)
        printf("%d ", numbers[i]);
    putchar('\n');

    free(numbers);
    return 0;
}

Не забудьте free() возвращенный указатель, когда вы закончите с его использованием.

...