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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2010, 13:18   #1
rosemary
 
Регистрация: 23.06.2010
Сообщений: 5
По умолчанию Сложение операнд.

Здравствуйте!

Требуется написать программу, производящую операцию сложения над операндами, являющимися строковыми представителями чисел в двоичной форме, но при решении нельзя использовать преобразования строкового типа в числовой.

Всё вроде бы просто.
Если "0" и "0" - в результирующую строку записываем "0"
"1" и "0", "0" и "1" - "1"
Проблемы начинаются, когда попадается "1" и "1". Каким способом можно осуществить перенос единицы?

Ах, да. Пишу на C#, ну или на Паскале тоже можно
rosemary вне форума Ответить с цитированием
Старый 23.06.2010, 15:21   #2
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

на C++

Код:
#include <cstdio>
#include <cstring>
#include <conio.h>

void Adding(char* dest, char* comp1, char* comp2);	//функция сложения операндов в string-binary

void main(){
	char *str[2]={"00000011", "111"};	//два операнда (они могут быть разных размеров, тогда операнд меньшей длины 
														//дозаполняется слева нулями)
	char sum[9]={"00000000"};					//их результат
	Adding(sum,str[0],str[1]);						//сложение
	printf ("sum = %sb", sum);						//вывод
	_getch();
	return;
}

void Adding(char* dest, char* comp1, char* comp2){
	short n(0), n1(0), n2(0), len1(0), len2(0);
	len1=strlen(comp1);	//длина первого операнда
	len2=strlen(comp2);	//длина второго операнда
	n1=len1-1;					//счетчик первого операнда
	n2=len2-1;					//счетчик второго операнда

	if (len1>len2){			//счетчик суммы
		n=len1-1;				
	}
	else{
		n=len2-1;
	}
	bool cf(false);			//carry flag - флаг переноса
	while (n1>=0 && n2>=0){
		if (comp1[n1]=='0')
		{
			if (comp2[n2]=='0') // 0+0 + cf = cf; cf=false;
			{
				if (cf) 
					dest[n]='1';
				else 
					dest[n]='0';
				cf=false;
			}
			else	// 0+1 + cf = 1+cf; cf = false || true ? // cf=cf;
			{
				if (cf)
				{
					dest[n]='0';
					cf=true;
				}
				else
				{
					dest[n]='1';
					cf=false;
				}
			}
		}
		else	
		{
			if (comp2[n2]=='0')	// 1+0+cf=1+cf; cf = false || true ? // cf=cf;
			{
				if (cf)
				{
					dest[n]='0';
					cf=true;
				}
				else
				{
					dest[n]='1';
					cf=false;
				}
			}
			else						// 1+1+cf=cf; cf = true;
			{
				if(cf)
					dest[n]='1';
				else
					dest[n]='0';
				cf=true;
			}
		}
		n1--;
		n2--;
		n--;
	}
	if (cf)
		dest[n]='1';
	else
		dest[n]='0';
	for (short k=n-1; k>=0; k--){
		dest[k]='0';	//дозаполняем нулями сумму
	}
	return;
}

Последний раз редактировалось capta1n; 23.06.2010 в 15:36.
capta1n вне форума Ответить с цитированием
Старый 23.06.2010, 15:28   #3
rosemary
 
Регистрация: 23.06.2010
Сообщений: 5
По умолчанию

Ох, придётся знакомиться с С++ Большое спасибо!
rosemary вне форума Ответить с цитированием
Старый 23.06.2010, 15:30   #4
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Я думаю тут надо сравнивать сразу три числа, т.е. например если у тебя массивы: first - первое число, second - второе, answer - массив с ответом, который изначально заполнен нулями.
то надо смотреть что находится на i-ом месте всех трех массивов и если там встречается две и больше единицы то записывать в answer[i+1]="1", а остальное все как у тебя выше описанно.
Если не разобрался, то пиши вечерком выложу готовый код.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 23.06.2010, 15:44   #5
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

да если с шарпом проблем нет, то CPP освоить не долго
capta1n вне форума Ответить с цитированием
Старый 23.06.2010, 16:24   #6
rosemary
 
Регистрация: 23.06.2010
Сообщений: 5
По умолчанию

KobolD, код приведённый capta1n отлично работает. "Перевела" его, так сказать, на C# и всё здорово складывается
rosemary вне форума Ответить с цитированием
Старый 23.06.2010, 17:06   #7
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

KobolD просто предложил другую реализацию, за что ему +
capta1n вне форума Ответить с цитированием
Старый 23.06.2010, 17:06   #8
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

KobolD просто предложил другую реализацию, за что ему +
capta1n вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложение(Add) Rymbil Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 22.01.2010 10:24
сложение с условием Palmer Microsoft Office Excel 12 18.12.2009 09:12
Сложение в БД Oleg Romanchuk Помощь студентам 5 24.11.2009 09:30
сложение цифр densan Помощь студентам 9 19.10.2008 12:06
Сложение Droid Общие вопросы Delphi 14 07.05.2008 13:23