Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2013, 23:47   #1
_Лето_
Пользователь
 
Регистрация: 04.11.2013
Сообщений: 23
По умолчанию Перевод в двоичную систему счисления

Пожалуйста, помогите с задачкой. Даны два числа a, b их нужно сперва перевести в двоичную систему счисления (сами они из десятичной), а потом сложить. Можете объяснить как программа должна работать? Вообще не понимаю... Это с остатком нужно что ли что-то делать? Делить на два?
_Лето_ вне форума Ответить с цитированием
Старый 22.11.2013, 08:52   #2
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

В принципе да, число надо делить на два и брать остаток. Из остатка на каждом шаге будет формироваться представление двоичного число.
nikmoon вне форума Ответить с цитированием
Старый 22.11.2013, 11:22   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Что именно у Вас не получается сделать?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 23.11.2013, 12:08   #4
_Лето_
Пользователь
 
Регистрация: 04.11.2013
Сообщений: 23
По умолчанию

Программа не получается. Если как перевести эти два числа я примерно представляю, то как сложить - без понятия.
_Лето_ вне форума Ответить с цитированием
Старый 24.11.2013, 12:45   #5
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Код:
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <iomanip>

using namespace std;

//
//	Получить максимум
//
int max(int _a, int _b)
{
	return (_a > _b) ? _a : _b;
}


//
//	Реверсировать содержимое строки
//
void reverse_bin(char * _bin)
{
	int si = 0, ei = strlen(_bin) - 1;
	while(si < ei)
	{
		char tmp = _bin[si];
		_bin[si] = _bin[ei];
		_bin[ei] = tmp;
		si++;
		ei--;
	}
}

//
//	Точка входа в приложение
//
int main()
{
	// здесь можно указать любые двоичные числа
	char bin_a[] = "10101011",
		 bin_b[] = "11111010";

	// требуемый размер строки для суммы
	int sum_len = max(strlen(bin_a), strlen(bin_b)) + 1;

	// выделяем память для хранения суммы с учетом завершающего \0
	char *bin_sum = new char[sum_len + 1];

	// обнуляем строку суммы
	memset(bin_sum, 0, sum_len + 1);

	// используя обычное сложение столбиком, будем складывать числа a и b.
	// т.к. до окончания сложения мы не знаем точно, сколько символов будет занимать результат,
	// сохранять символы результата будем в обратном порядке, т.е. от начала строки к концу.
	// после формирования результата сложения поменяем порядок символов на реверсивный

	int ia = strlen(bin_a) - 1,
		ib = strlen(bin_b) - 1,
		isum = 0;

	while ((ia >=0 ) && (ib >= 0))
	{
		// сумма текущих разрядов с учетом переноса
		int sum = (bin_a[ia] - '0') + (bin_b[ib] - '0') + bin_sum[isum];

		bin_sum[isum++] = (sum % 2) + '0';	// сохраняем значение суммы в текущем разряде
		bin_sum[isum] = (sum / 2);			// сохраняем бит переноса

		ia--;
		ib--;
	}

	// если одно из слагаемых имело больше разрядов чем, другое, вычисления не окончены
	char *bin_x = NULL;
	int ix;
	if (ia >= 0)
	{
		bin_x = bin_a;
		ix = ia;
	}
	else if (ib >= 0)
	{
		bin_x = bin_b;
		ix = ib;
	}

	if (bin_x)
	{
		while(ix >= 0)
		{
			int sum = (bin_x[ix] - '0') + bin_sum[isum];

			bin_sum[isum++] = (sum % 2) + '0';	// сохраняем значение суммы в текущем разряде
			bin_sum[isum] = (sum / 2);			// сохраняем бит переноса

			ix--;
		}
	}

	bin_sum[isum] += '0';

	reverse_bin(bin_sum);

	cout << setw(7) << " a = " << setw(sum_len) << bin_a << endl;
	cout << setw(7) << " b = " << setw(sum_len) << bin_b << endl;
	cout << setw(7) << " Sum = " << setw(sum_len) << bin_sum << endl;

	return EXIT_SUCCESS;
}
Проверял только на указанных значениях.
nikmoon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из десятеричной в двоичную систему счисления idShura Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 13.06.2012 19:39
Перевод числа в двоичную систему lord2012 Помощь студентам 2 15.05.2012 06:57
Строка неограниченной длины char в двоичную систему счисления mizantrop32 Общие вопросы C/C++ 3 07.11.2010 16:17