Как вывести дробь вместо десятичного числа?
В C++, когда я вычисляю 2/3, он будет выводить десятичные значения, как я могу просто получить исходный формат (i.e.g 2/3) вместо 0,66666667
спасибо
13 ответов
ты не можешь. Вам нужно будет написать класс, посвященный удержанию рациональных чисел (т. е. дробей). Или, может быть, просто используйте повысить библиотеку рациональных чисел.
Если я правильно понимаю, у вас есть число с плавающей запятой (a float
или double
введите переменную), и вы хотите вывести это значение как дробь.
Если это так, вам нужно уточнить свой вопрос:
- номер FP is дробь, по определению: число FP состоит из двух целых чисел, мантисса m и expontent e (и знак, но здесь это не имеет значения). Таким образом, каждый номер FP действительно пара (m,e) и значение f он представляет f=mb^e (где b является фиксированной интегральной базой, обычно 2). Таким образом, естественное представление как дробь просто m / b^(- e) С e (если e > =0 , f в любом случае неотъемлемой частью).
- тем не менее, вы, вероятно, хотите получить фракцию с наименьшим разумным делителем. Это разные вопрос. Чтобы получить, вы можете, например, использовать bestappr функция из библиотеки Pari/GP. В вашем случае вы, вероятно, используете
bestappr(x, A)
С x ваш вклад, и A наибольший знаменатель вы хотите попробовать. bestappr даст вам фракцию, ближайшую к x знаменатель которого все еще меньше A.
напишите свой собственный рациональный класс для вычисления делений
class Rational
{
public:
int numerator, denominator;
Rational(int num, int den=1){
numerator = num;
denominator=den;
}
Rational(Rational other){
numerator = other.numerator;
denominator = other.denominator;
}
double operator / (int divisor){
denominator *= divisor;
simplificate();
return getrealformat();
}
Rational& operator / (int divisor){
denominator *= divisor;
simplificate();
return this;
}
Rational& operator / (Rational &divisor){
numerator *= divisor.numerator;
denominator *= divisor.denominator;
simplificate();
return this;
}
double operator / (int divisor){
denominator *= divisor;
simplificate();
return getrealformat();
}
double getrealformat(){
return numerator/denominator;
}
simplificate(){
int commondivisor = 1;
for(int i=2;i<=min(abs(numerator), abs(denominator));i++)
if( numerator%i == 0 && denominator%i == 0 )
commondivisor = i;
numerator /= commondivisor;
denominator /= commondivisor;
}
};
использовать
Rational r1(45), r2(90), r3=r1/r2;
cout<<r3.numerator<<'/'<<r3.denominator;
cout<<r3.getrealformat();
Как я могу просто получить исходный формат (Я. e.g 2/3) вместо 0,66666667
только с большим трудом, завернув что-то вроде GMP библиотека с настраиваемыми операторами вывода. Ниже немного больше о GMP:
что такое GMP?
GMP-бесплатная библиотека для арифметика произвольной точности, работа со знаковыми целыми числами, rational числа и числа с плавающей запятой. Нет практического предел точности, кроме тех, которые подразумеваются доступная память в машине GMP работает дальше. GMP имеет богатый набор функций, и функции у обычный интерфейс.
основные целевые приложения для GMP приложения криптографии и исследования, интернет-безопасность приложения, системы алгебры, исследование вычислительной алгебры и т. д.
ГМП осторожно конструировано для того чтобы быть как быстро как возможный, оба для малого операндов и для огромных операнды. Этот скорость достигается с помощью fullwords в качестве основного арифметического типа, используя быстрые алгоритмы, с сильно оптимизированным код сборки для наиболее распространенных внутренние петли для многих процессоров, и общий акцент на скорости.
ГМП быстрее чем любое другое бигнум библиотека. Преимущество для GMP увеличивается с размерами операнда для много деятельностей, в виду того что пользы GMP асимптотически более быстрые алгоритмы.
первый выпуск GMP был сделан в 1991. Он постоянно развивается и поддерживается, с новым выпуском о раз в год.
вы должны хранить их в каком-то классе дроби с двумя целочисленными полями. Конечно, вы должны упростить фракцию, прежде чем использовать ее для вывода.
вы можете разработать свой собственный класс или использовать некоторые библиотеки, например, для точной математики:библиотека CLN - Class для чисел
Это вообще невозможно: числа с плавающей запятой не точны и не сохраняют достаточной информации для полной реконструкции дроби.
вы можете, однако, написать функцию, которая эвристически находит "оптимальное" приближение, в котором предпочтительны дроби с небольшими числителями и знаменателями, а также дроби, которые имеют почти то же значение, что и число с плавающей запятой.
Если вы полностью контролируете код, идея Оли лучше: не выбрасывать информацию, в первую очередь.
вы можете хранить все числители и знаменатели вашей фракции в качестве интергеров. Целые числа имеют точные представления в двоичном формате.
чтобы упростить усилия, я предлагаю вам придерживаться известных знаменателей, если это возможно.
Я работаю с приложением, где дроби ограничены знаменателями степеней 2 или используют 3 (для третей).
я преобразую в эти дроби, используя приближение (округление до ближайшего 1.0/24.0).
без некоторых ограничений поиск знаменателя может быть довольно сложной задачей и занимать много времени выполнения.
Я новичок, и этот способ, который я использую, может быть неправильным способом
#include <iostream>
using namespace std;
int main ()
{
double a;
double b;
double c;
cout << "first number: ";
cin >> a;
cout << "second number: ";
cin >> b;
c = a/b;
cout << "result is: " << c << endl;
if (b != 0) {
if (a > 0) {
if (c - (int)c > 0 && c - (int)c < 1)
cout << "fraction: " << a << "/" << b;
} else {
if (c - (int)c < 0 && c - (int)c < 1)
cout << "fraction: " << a << "/" << b;
}
}
return 0;
}
#include <iostream>
using namespace std;
int main() {
int a,b,q,r;
cin>>a>>b;//first number and second number
q = a/b;
r = a-q*b;
cout<<q<<" "<<r<<" "<<"/"<<" "<<b<<"\n";
return 0;
}
Я просто получил коэффициент a / b, а затем получил остаток a-q*b. откройте для предложений, если таковые имеются.
используйте концепцию наибольшего общего делителя.
если мы разделим числа с gcd их чисел, мы получим наименьшее возможное значение из них.пример: -
#define si long long
int main() {
si int total=4;
si int count=2;
si int g= __gcd(count,total);
count/=g;
total/=g;
cout<<count<<"/"<<total<<endl;
}
for more reference check out this:-https://www.codechef.com/viewsolution/17873537
Это программа для преобразования десятичного числа в дробь
#include<iostream>
using namespace std;
int main()
{
float num, origNum, rem = 1;
int den = 1, i, count=0, gcd=1;
cout << "Enter any float number to convert it into mixed fraction: ";
cin >> origNum;
num = origNum - static_cast<int>(origNum);
if (num > 0.1)
{
while ( (rem > 0.1) )
{
num = num * 10;
rem = num - static_cast<int>(num);
count++;
}
for (i = 1; i <= count; i++) // counter is for the calculation of denominator part of mixed fraction
{
den = den * 10;
}
for (i = 2; i <= num|| i<=rem; i++)
{
if( (static_cast<int>(num) % i == 0) && (den % i == 0) )
{
gcd = i;
}
}
cout << (static_cast<int>(origNum)) << " and " << (static_cast<int>(num))/gcd << "/" << den/gcd;
}
else
cout << (static_cast<int>(origNum));
return 0;
}