C/C++

С++ Помогите с задачей, как написать программу без массивов?

Serdar Namazow
Serdar Namazow
20
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "bin: ";
string bin;
cin >> bin;
auto dec = 0ULL;
auto n = 0ULL;
for (auto pos = bin.rbegin(); pos != bin.rend(); ++pos) {
dec += *pos == '1' ? static_cast<unsigned long long>(pow(2ULL, n)) : 0ULL;
++n;
}
cout << "dec: " << dec << '\n';
system("pause > nul");
}
Александр Кошев
Александр Кошев
99 254
Лучший ответ
Владимир Ромодин Николай, неужели Вы не догадались, что в условии есть подсказка, использовать транслит числа из двоичной в десятичную?
Владимир Ромодин Да, транслит требует наложения ограничения max = 20 двоичных цифр.

Однако, если max = 64 двоичных цифр, то самый простой вариант — с посимвольным вводом (например, cin.get()) и побитовым сдвигом влево.
Владимир Ромодин /* ТО ЕСТЬ */

#include <iostream>
using namespace std;
int main() {
unsigned long long res = 0;
int dig;
cin.sync();
cout << "Пожалуйста, вводите не более 64 двоичных цифр\nВаш ввод: ";
while ((dig = cin.get()) != '\n')
(res <<= 1) |= (dig & 1);
cout << "Введено число " << res << " в десятичной системе.";
return 0;
}
Владимир Ромодин Правда в том, что такое решение всё равно не примут.

В условии однозначно написано: «Используйте операции деления и вычисления остатка…»
Владимир Ромодин Сборку результата можно вести в том же цикле. Поскольку цифры извлекаются с конца, то добавлять их в результат можно, чередуя со сдвигом вправо.
Для результата используется переменная типа long (32 bit), но значимы только 20, поскольку разрядность современных машин максимум 64 бит, в десятичном представлении не более 20 цифр. Придётся ограничить входные данные максимумом 20 цифр (2²⁰ – 1), тогда входная переменная будет типа unsigned long long.
Владимир Ромодин Каждая извлечённая цифра помещается в разряд №20 результата с последующим сдвигом вправо либо сначала сдвиг, потом вставка в бит №19.
Поскольку заранее неизвестно, сколько реально цифр введёт пользователь, в цикле используется убывающий счётчик. После заполнения старших разрядов всё содержимое результата сдвигается вправо на остаточную величину счётчика.

Альтернативно можно использовать сдвиговый счётчик (сдвиг влево) и вставлять цифры в разные разряды (остаточный сдвиг не требуется).
Ну используй какие нибудь другие структуры, вектора например.
Если нужно без массива, то создавай структуру - struct, создавай в ней поля, можно битовые поля. Как раз для твоей задачи подходит.
Resul Orazmyradow
Resul Orazmyradow
37 945
Владимир Ромодин Евгений, битовые поля это круто!

Вот только как реализовать последовательный доступ в цикле???
  Главная цель этого задания — показать решающему всю важность, ценность первого этапа разработки ПО — составления модели задачи. Выбранная модель определяет все методы решения задачи и в конечном счёте — алгоритм.

#include <iostream>
using namespace std;
int main() {
unsigned long long inp; // принимает имитацию двоичной записи!
int dig = 1; // сдвиговый счётчик! 1→2→4→8→16→ и т. д.
long res = 0; // 32-битный результат, значимы младшие 20 бит, изначально заполнены нулями!
// ВВОД
cout << "Пожалуйста, вводите не более 20 двоичных цифр\nВаш ввод: ";
cin.sync();
cin >> inp; // ввод пользователя
// ОБРАБОТКА
/* Цикл, пока inp > 0 (если изначально inp == 0, то res == 0)
inp % 10 — младшая цифра исходного числа
если младшая цифра ==1, то res += dig либо res |= dig
inp /= 10 — выталкивание младшей цифры из записи числа
увеличиваем счётчик dig *= 2 либо dig <<= 1
Конец цикла */

while (inp > 0) {
if ((inp % 10) == 1) res += dig;
dig <<= 1; inp /= 10;
}
//ВЫВОД
cout << "Введено число " << res << " в десятичной системе.";
return 0;
}
Андрей Мельников   Обратите внимание, программа автоматически отвергает ведущие нули (если таковые введены пользователем).

    НЕДОСТАТОК!   Программа НЕ проверяет корректность ввода! Во-первых, все цифры, кроме единиц, она считает нулями! Во-вторых, если пользователь введёт хотя бы одну не-цифру, то это воспринимается как ввод числа ноль! Поток не проверяется на повреждение!
Если массив нельзя использовать в т. ч. для сохранения ввода, то можно использовать рекурсию...
Юрий Кузьмин
Юрий Кузьмин
2 364
массивы вообще-то нежелательно использовать, рулит вектор, стринг и другие контейнеры
потому что это Си++, это не Си