Poniżej przedstawiam program w języku C++, który znajduje rozwinięcie binarne nieskracalnego ułamka właściwego o mianowniku, który nie jest potęgą liczby 2:
#include <iostream>
#include <string>
#include <map>
using namespace std;
string binaryFraction(int numerator, int denominator) {
string result = ""; // inicjujemy wynik pustym ciągiem znaków
map<int, int> remainderMap; // używamy mapy do przechowywania wartości pozostałości i ich pozycji
int remainder = numerator % denominator; // obliczamy początkową wartość pozostałości
while (remainder != 0 && remainderMap.find(remainder) == remainderMap.end()) {
// dopóki pozostałość nie jest równa 0 i nie ma jej w mapie, kontynuujemy
remainderMap[remainder] = result.length(); // dodajemy pozostałość i jej pozycję do mapy
remainder *= 2; // mnożymy pozostałość przez 2, aby otrzymać kolejną cyfrę binarną
result += (remainder < denominator) ? "0" : "1"; // jeśli pozostałość jest mniejsza niż mianownik, dodajemy 0 do wyniku, w przeciwnym razie 1
remainder %= denominator; // obliczamy nową wartość pozostałości
}
if (remainder != 0) {
// jeśli pozostałość jest niezerowa, to ułamek jest okresowy
result.insert(remainderMap[remainder], "("); // dodajemy nawias otwierający przed cyfrą, od której zaczyna się okres
result += ")"; // dodajemy nawias zamykający na końcu wyniku
}
return result;
}
int main() {
int numerator, denominator;
cout << "Podaj licznik: ";
cin >> numerator;
cout << "Podaj mianownik (który nie jest potęgą liczby 2): ";
Program prosi użytkownika o podanie licznika i mianownika ułamka właściwego nieskracalnego, którego mianownik nie jest potęgą liczby 2. Następnie korzystając z algorytmu Hornera, program przelicza ułamek dziesiętny na ułamek binarny i zwraca wynik w postaci ciągu znaków. Jeśli ułamek jest okresowy, to program dodaje nawiasy okalające cyfry, od których zaczyna się okres.
1 votes Thanks 1
piotrekwasilczp658ww
Dzięki wielkie, chociaż nie korzystaliśmy jeszcze z tego remainder, numerator i denominator...
Nie Musisz Dziękować:
Odpowiedź:
Poniżej przedstawiam program w języku C++, który znajduje rozwinięcie binarne nieskracalnego ułamka właściwego o mianowniku, który nie jest potęgą liczby 2:
#include <iostream>
#include <string>
#include <map>
using namespace std;
string binaryFraction(int numerator, int denominator) {
string result = ""; // inicjujemy wynik pustym ciągiem znaków
map<int, int> remainderMap; // używamy mapy do przechowywania wartości pozostałości i ich pozycji
int remainder = numerator % denominator; // obliczamy początkową wartość pozostałości
while (remainder != 0 && remainderMap.find(remainder) == remainderMap.end()) {
// dopóki pozostałość nie jest równa 0 i nie ma jej w mapie, kontynuujemy
remainderMap[remainder] = result.length(); // dodajemy pozostałość i jej pozycję do mapy
remainder *= 2; // mnożymy pozostałość przez 2, aby otrzymać kolejną cyfrę binarną
result += (remainder < denominator) ? "0" : "1"; // jeśli pozostałość jest mniejsza niż mianownik, dodajemy 0 do wyniku, w przeciwnym razie 1
remainder %= denominator; // obliczamy nową wartość pozostałości
}
if (remainder != 0) {
// jeśli pozostałość jest niezerowa, to ułamek jest okresowy
result.insert(remainderMap[remainder], "("); // dodajemy nawias otwierający przed cyfrą, od której zaczyna się okres
result += ")"; // dodajemy nawias zamykający na końcu wyniku
}
return result;
}
int main() {
int numerator, denominator;
cout << "Podaj licznik: ";
cin >> numerator;
cout << "Podaj mianownik (który nie jest potęgą liczby 2): ";
cin >> denominator;
cout << "Rozwinięcie binarne ułamka właściwego nieskracalnego: " << binaryFraction(numerator, denominator) << endl;
return 0;
}
Dodatkowe Info:
Program prosi użytkownika o podanie licznika i mianownika ułamka właściwego nieskracalnego, którego mianownik nie jest potęgą liczby 2. Następnie korzystając z algorytmu Hornera, program przelicza ułamek dziesiętny na ułamek binarny i zwraca wynik w postaci ciągu znaków. Jeśli ułamek jest okresowy, to program dodaje nawiasy okalające cyfry, od których zaczyna się okres.