Creative Commons License Foxbond's Repo

/** (c) 2012 Michał (Foxbond) Chraniuk */
#include <iostream>
#include <string>
#include <conio.h>

using namespace std;

void cls () { system("cls"); }

string odejmowanie (string p, string d);
bool isBigger(string p, string d);
string increaseBy1 (string w);
void test(void);


int main (){
	//test();
	//return 0;
	cout <<"Program przyjmie liczby binarne o dowolnej dlugosci, jednak nie zalecam wpisywania dzielnej dluzszaj niz 20 bitow\n";
	_getch();
	int ch;
	do{
		cls();
		//pobieramy liczby
		string pLiczba, dLiczba;
		do{
			cout << "Podaj pierwsza liczbe:";
			cin >> pLiczba;
		}while (pLiczba.length() <= 0);
		
		do{
			cout << "\nPodaj druga liczbe:";
			cin >> dLiczba;
		}while (dLiczba.length() <= 0);
		
		cls();
		
		//wyswietlanie
		string l1 = pLiczba;
		//cout <<pLiczba<<":"<<dLiczba<<"=";

		string wynik="0";

		//główna pętla
		while (true){
			
			//usuwanie zer z początku
			while(true){
				if (pLiczba[0] == '0'){
					pLiczba = pLiczba.substr(1);
				}else{
					break;
				}
			}
			//to samo dla dzielnika
			while(true){
				if (dLiczba[0] == '0'){
					dLiczba = dLiczba.substr(1);
				}else{
					break;
				}
			}

			//sprawdzanie czy aby na pewno dzielnik nie jest większy
			if (!isBigger(pLiczba, dLiczba)){
				break;
			}

			//magic
			pLiczba = odejmowanie(pLiczba, dLiczba);

			//zwiekszamy wynik o jeden (binarnie)
			wynik = increaseBy1(wynik);

			cout << ".";
		}

		//odwrocic wynik
		wynik = string ( wynik.rbegin(), wynik.rend() );

		//wyswietlanie
		cls();
		cout <<l1<<":"<<dLiczba<<"="<< wynik << "\nr= " << pLiczba;
	
		cout << "\n Nacisnij dowolny klawisz, aby kontynuowac, lub esc, aby zakonczyc\n";
		ch = _getch();
	}while(ch != 27);
	
	return 0;
}

string odejmowanie (string p, string d){

	//bit znaku
	p = '0'+p;


	//wyrównywanie
	int roz = p.length()-d.length();
	for (int i=0;i<roz;i++){
		d = '0'+d;
	}


	//odwracanie ( U2 )
	bool rev =false;
	for (int i=(d.length()-1);i>=0;i--){
		if (!rev){
			if (d[i] == '1'){ rev=true; } 
		}else{
			if (d[i] == '1'){ d[i] = '0'; }
			else { d[i] = '1'; }
		}
	}


	//dodawanie
	bool mem=false;
	for (int i=(p.length()-1);i>=0;i--){
		if (p[i] == '1' && d[i] == '1' && mem){
			p[i] = '1';
		}else if (p[i] == '1' && d[i] == '1' && !mem){
			p[i] = '0';
			mem=true;
		}else if (p[i] == '1' && d[i] == '0' && mem){
			p[i] = '0';
		}else if (p[i] == '1' && d[i] == '0' && !mem){
			p[i] = '1';
		}else if (p[i] == '0' && d[i] == '1' && mem){
			p[i] = '0';
		}else if (p[i] == '0' && d[i] == '1' && !mem){
			p[i] = '1';
		}else if (p[i] == '0' && d[i] == '0' && mem){
			p[i] = '1';
			mem=false;
		}else {
			p[i] = '0';
		}

	}

	return p;
}

bool isBigger (string p, string d){

	//spr. długości
	if (d.length() > p.length()){
		return false;
	}else if (d.length() < p.length()){
		return true;
	}else{
		//sprawdzenie, gdzie wcześniej wystąpi jedynka
		for (int i=0;i<p.length();i++){
			if (p[i] == '0' && d[i] == '1'){
				return false;
			}
		}
	}
	return true;
}

string increaseBy1 (string w){
	for(int i=0;true;i++){
		if ((i+1) > w.length()){
			w += '0';
		}
		if (w[i] == '0'){
			w[i] = '1';
			break;
		}else {
			w[i] = '0';
		}

	}

	return w;
}

void test (void){
	int a,b;
	int w=0;
	cin >> a;
	cin >> b;

	int c=a;
	while (a >b ){
		a = a-b;
		w++;
	}

	cout << c << ":" << b << "=" << w << "\nr=" << a;
}

> Back