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

#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");
}
#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");
}
Ну используй какие нибудь другие структуры, вектора например.
Если нужно без массива, то создавай структуру - struct, создавай в ней поля, можно битовые поля. Как раз для твоей задачи подходит.
Владимир Ромодин
Евгений, битовые поля это круто!
Вот только как реализовать последовательный доступ в цикле???
Вот только как реализовать последовательный доступ в цикле???
Главная цель этого задания — показать решающему всю важность, ценность первого этапа разработки ПО — составления модели задачи. Выбранная модель определяет все методы решения задачи и в конечном счёте — алгоритм.
#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;
}
#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;
}
Андрей Мельников
Обратите внимание, программа автоматически отвергает ведущие нули (если таковые введены пользователем).
НЕДОСТАТОК! Программа НЕ проверяет корректность ввода! Во-первых, все цифры, кроме единиц, она считает нулями! Во-вторых, если пользователь введёт хотя бы одну не-цифру, то это воспринимается как ввод числа ноль! Поток не проверяется на повреждение!
НЕДОСТАТОК! Программа НЕ проверяет корректность ввода! Во-первых, все цифры, кроме единиц, она считает нулями! Во-вторых, если пользователь введёт хотя бы одну не-цифру, то это воспринимается как ввод числа ноль! Поток не проверяется на повреждение!
Если массив нельзя использовать в т. ч. для сохранения ввода, то можно использовать рекурсию...
массивы вообще-то нежелательно использовать, рулит вектор, стринг и другие контейнеры
потому что это Си++, это не Си
потому что это Си++, это не Си
Андрей Мельников
Стек?
Похожие вопросы
- Помогите решить задачу на С++, используя статические массивы
- Напишите программу, статич. массив
- Помогите написать программу по обработке двухмерного массива в с++
- Помогите исправить и дописать программу с массивами на языке C++. Буду благодарен, т. к. самому уже не понятно.
- Написать программу «справочник». Создать два одномерных массива. Один массив хранит номера мобильных телефонов, второй
- Написать программу на С++ с применением одномерных массивов, используя указатели.
- Помогите плиз написать программу на Си Массив структур
- Помогите, пожалуйста, написать программу по нижеописанной задаче!
- Помогите, пожалуйста, написать программу на C++ (массивы)
- С++.Помогите пожалуйста! Написать программу по обработке динамических массивов. Размеры массивов вводить с клавиатуры.
Однако, если 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.
Поскольку заранее неизвестно, сколько реально цифр введёт пользователь, в цикле используется убывающий счётчик. После заполнения старших разрядов всё содержимое результата сдвигается вправо на остаточную величину счётчика.
Альтернативно можно использовать сдвиговый счётчик (сдвиг влево) и вставлять цифры в разные разряды (остаточный сдвиг не требуется).