Итерировать длинное целое число, а затем добавить число в массив в C - PullRequest
0 голосов
/ 20 июня 2020

Итак, я предлагаю пользователю ввести число, сохраненное как long int, затем я хочу сделать для l oop и повторить этот long int, получив все нечетные номера позиций в odd array и все четные номера позиций в even array. Я пытаюсь решить проблему с кредитом, установленную из CS50

#include <stdio.h>
#include <cs50.h>

int main(void)
{
    long even[] = {}, odd[] = {};
    long cc = get_long("Number: ");
}

В основном я пытаюсь получить это:

Если long cc = 12345678912345, то четное должно быть even[7] = {1, 3, 5, 7, 9, 2, 4} и нечетное должно быть odd[7] = {2, 4, 6, 8, 1, 3, 5}

Я действительно не знаю, как я смогу перебрать long cc, чтобы затем добавить определенное c число, которое мне нужно, в массив

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

это довольно просто, просто выделите два массива с количеством чисел в cc, используя что-то вроде

int temp = cc, i = 0;
while (temp > 0) {i++; cc /= 10;}

Затем вычислите ur следующим образом:

while (cc > 0) 
{
newNumber = cc/10; 
newDigit = CC % 10
if (newNumber % 2 == 0) /*newDigit is even*/
else /*newDigit is odd*/
cc = newNumber;
}
0 голосов
/ 20 июня 2020

Основная проблема заключается в том, что массивы в C имеют фиксированный размер, установленный при их создании, и этот размер нельзя изменить. Таким образом, нет способа «добавить» к массиву.

Обычный способ справиться с этим - создать массив максимального размера (или емкости) и отслеживать «используемую» часть массива с помощью отдельная переменная (часто называемая размером). В любой момент времени элементы массива от 0 до размера-1 «используются» и действительны, в то время как элементы от размера до емкости-1 «свободны» и могут содержать значения мусора, которые будут игнорироваться.

Поскольку массив и переменная размера так тесно связаны, их обычно объединяют в структуру, чтобы упростить управление:

#define MAX_ARRAY_SIZE 100
struct long_array {
    size_t size;
    long data[MAX_ARRAY_SIZE];
};

Теперь вы можете инициализировать пустой массив с помощью struct long_array odd = { 0 };, и вы затем можно было бы добавить к этому массиву

if (odd.size == MAX_ARRAY_SIZE) {
    /* always check for errors or unexpected situations! */
    fprintf(stderr, "array overflow\n");
    exit(1); }
odd.data[odd.size++] = new_value;

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

struct long_array {
    size_t size, capacity;
    long *data;
};

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

0 голосов
/ 20 июня 2020

Вы можете использовать оператор по модулю%, чтобы получить каждое di git. Оператор по модулю в основном дает вам остаток, поэтому, если вы сделаете% 10, он даст вам последний di git. Итак, 123% 10 = 3. Затем вы делите номер кредитной карты на 10 и повторяете процесс, чтобы получить следующий di git. Например, 123/10 = 12, тогда 12% 10 равно 2. Если вы создадите переменную счетчика, чтобы подсчитать, сколько раз вы выполнили l oop, это даст вам позицию. Если вы сделаете позицию% 2, это скажет вам, является ли оно нечетным или четным.

while (CC > 0)
    digit = CC % 10
    if (position % 2 == 1) //it's odd

    else //its even
    
    CC = CC/10  //to prepare for next iteration of the loop
    position = position + 1  //position starts at right side of CC number

Один из других предложенных здесь ответов определяет, является ли значение di git нечетным или even, но вы пытаетесь определить, находится ли di git в четном или нечетном положении. В другом предложенном ответе используется массив, о котором вы узнаете позже в курсе, и это не то, чему класс пытается вас научить сейчас.

Решение, которое я предложил, находится в очереди с тем, что уже было изучено вашим классом. Позже вы узнаете о массивах и сможете подойти к этой проблеме иначе. Позже вам нужно будет решить ту же задачу в Python, и в этот раз я принял значение в виде строки, потому что вы можете обрабатывать полный номер кредитной карты как массив, а затем каждый di git является просто элементом в этом массиве. Например, creditcardnumberarray[0] будет первым di git. Вам нужно будет изменить каждый di git с Char на Int перед выполнением контрольной суммы. Это преобразование можно выполнить, вычтя символ di git из символа '0'. Итак int digitAsInt = digitAsChar - '0'

...