/** (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