Всем привет!
Начал изучение гарводского курса CS50 и столкнулся с небольшими затруднениями при решении задачи.
Дано: пользователь вводит число с клавиатуры (номер кредит. краты). Мы должны проверить является ли карта настоящей, выполнив некоторые математические операции с отдельными цифрами этого номера. По условиям рекомендуют номер записывать с помощью функции GetLongLong из библиотеки курса. Математические операции предполагают например удвоение каждой второй цифры в этом номере. То есть по сути требуется эту каждую вторую как-то вычленить из полного номера.
Вот тут у меня и произошло заклинивание. Ведь если мы положим номер в одну переменную типа лонг, то доступ к каждой второй цифре затруднителен. Или нет и я просто не знаю как?
Есть конечно варинт с массивом данных. Тогда мне не понятно как сделать так, чтобы каждая последущая напечатанная цифра попадала в отдельную ячейку массива, не применяя при этом клавиши Enter?
В общем буду рад любой подсказке, в каком направлении мне стоит копать))) Всем откликнувшимся заранее огромное спасибо!
Ввод данных из консоли в одномерный массив (Си)
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Чтобы взять N-ную цифру из числа надо число сдвинуть вправо на N позиций (в десятичной системе) и посмотреть на остаток от деления на 10 у полученного числа. Правый сдвиг на N позиций в десятичной системе это деление на 10^N.
То есть имеем
То есть имеем
Код: Выделить всё
int ipow(int base, int exp)
{
int result = 1;
while (exp)
{
if (exp & 1)
result *= base;
exp >>= 1;
base *= base;
}
return result;
}
// ...
long number = ///...
int digit = (number / ipow(10, N)) % 10;
2B OR NOT(2B) = FF
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Можно поступить ещё проще. Считать данные не как число, а как строку. Тогда доступ к каждому отдельному элементу будет таким же простым, как и в обычном массиве. Нужно только будет учесть, что в ячейках будут лежать не цифры (например 1, 2), а символы ('1', '2'), так что для того, чтобы из символа получить соответствующую цифру, нужно от его значения отнять '0'. Ну и с негативным тестингом тоже немного поиграть: как минимум обработать случай того, что символ не является цифрой, выдав ошибку.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 2
- Зарегистрирован: 24 авг 2016, 13:18
Absurd писал(а):Чтобы взять N-ную цифру из числа надо число сдвинуть вправо на N позиций (в десятичной системе) и посмотреть на остаток от деления на 10 у полученного числа. Правый сдвиг на N позиций в десятичной системе это деление на 10^N.
[/code]
Спасибо за подсказку, решил попробовать ваш метод. Получается число ЛОНГ положит ьв массив по элементам. Загвоздка теперь в том, что числа в массиве лежат в обратном порядке. Как перевернуть массив в джаве я знаю. Но вот как сделать это в Си не приложу ума. Может и тут сможете подсказать?
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Код: Выделить всё
#include <algorithm>
...
long arr[N];
std::reverse(arr, arr + N);
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Это как-то тупо. Лучше бы их класть в массив в прямом порядке. То есть брать разряды не от нуля и выше, а от максимума и ниже. Как вы наверное знаете из математики, максимальный разряд числа это (логарифм числа по основанию 10) + 1.
2B OR NOT(2B) = FF