В С++, когда я вычисляю 2/3, он выводит десятичные значения, как я могу просто получить исходный формат (например, 2/3) вместо 0,66666667
Спасибо
В С++, когда я вычисляю 2/3, он выводит десятичные значения, как я могу просто получить исходный формат (например, 2/3) вместо 0,66666667
Спасибо
Вы не можете. Вам нужно будет написать класс, посвященный хранению рациональных чисел (т.е. дробей). Или просто используйте библиотеку Boost Rational Number.
int
, которые производят 0.66666667
. Почему бы просто не написать функцию, которая выбирает один? Ответ не ты не можешь
- person Inverse; 31.01.2011
0.66666667
. Это может быть 1/3, или 1000000/3000001, или 1000001/3000000 и т. д. (предполагая, что достаточно нулей, чтобы исчерпать точность FP). Вы можете легко показать, что для любого числа FP существует бесконечное (хотя и счетно бесконечное) количество целых дробей.
- person sleske; 16.11.2011
66666667/100000000
, это O (1). Затем запустите какой-нибудь вариант GCD, чтобы уменьшить дробь, если хотите.
- person Inverse; 18.11.2011
Если я правильно понимаю, у вас есть число с плавающей запятой (переменная типа float
или double
), и вы хотите вывести это значение в виде дроби.
Если это так, вам необходимо уточнить свой вопрос:
bestappr(x, A)
с x вашим вводом и A наибольшим знаменателем, который вы хотите попробовать. bestappr даст вам ближайшую к x дробь, знаменатель которой меньше A.напишите свой собственный класс Rational для вычисления делений
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();
float
или double
в Rational
?
- person Thomas Matthews; 27.01.2011
как я могу просто получить исходный формат (например, 2/3) вместо 0,66666667
Только с большим трудом, обернув нечто вроде библиотеки GMP пользовательскими операторами вывода. Ниже немного больше о GMP:
Что такое GMP?
GMP — это бесплатная библиотека для арифметики произвольной точности, работающая с целыми числами со знаком, рациональными числами и числами с плавающей запятой. Нет никаких практических ограничений для точности, кроме тех, которые подразумеваются доступной памятью в машине, на которой работает GMP. GMP имеет богатый набор функций, а функции имеют обычный интерфейс.
Основными целевыми приложениями для GMP являются приложения и исследования в области криптографии, приложения для обеспечения безопасности в Интернете, системы алгебры, исследования в области вычислительной алгебры и т. д.
GMP тщательно спроектирован так, чтобы быть максимально быстрым как для небольших операндов, так и для больших операндов. Скорость достигается за счет использования полных слов в качестве основного арифметического типа, использования быстрых алгоритмов, высокооптимизированного ассемблерного кода для наиболее распространенных внутренних циклов для многих ЦП и общего упора на скорость.
GMP работает быстрее, чем любая другая библиотека bignum. Преимущество GMP увеличивается с размером операнда для многих операций, поскольку GMP использует асимптотически более быстрые алгоритмы.
Первая версия GMP была выпущена в 1991 году. Она постоянно развивается и поддерживается, а новая версия выпускается примерно раз в год.
Вы должны хранить их в каком-то классе Fraction с двумя целочисленными полями. Конечно, вы должны упростить дробь, прежде чем использовать ее для вывода.
Вы можете разработать свой собственный класс или использовать некоторые библиотеки, такие как эта для точной математики: CLN — библиотека классов для чисел< /а>
float
или double
в дробь. Преобразование в дробь может происходить с помощью класса Fraction.
- person Thomas Matthews; 27.01.2011
float
и double
в некотором роде также являются дробями. Насколько я понял, вопрос был о том, как решить проблему с самого начала, и решение состоит в том, чтобы в первую очередь избегать создания переменных float
или double
.
- person Mauro Vanetti; 03.02.2011
В общем случае это невозможно: числа с плавающей запятой неточны и не сохраняют достаточно информации для полного восстановления дроби.
Однако вы могли бы написать функцию, которая эвристически находит «оптимальное» приближение, в соответствии с которым предпочтительны дроби с малыми числителями и знаменателями, а также дроби, имеющие почти то же значение, что и число с плавающей запятой.
Если вы полностью контролируете код, идея Оли лучше: не выбрасывайте информацию в первую очередь.
Вы можете хранить все числители и знаменатели вашей дроби как целые числа. Целые числа имеют точное представление в двоичном виде.
Чтобы упростить усилия, я предлагаю вам по возможности придерживаться известных знаменателей.
Я работаю с приложением, в котором дроби ограничены знаменателями степени 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;
}
1.25
на 1
и .25
). Но вопрос заключается в преобразовании числа с плавающей запятой в дробное представление рационального числа, то есть 1 1/4
или 5/4
.
- person jogojapan; 10.06.2013
1.25
ваша программа выводит 1
и .25
, верно? Как он превращает .25
в 1/4
?
- person jogojapan; 10.06.2013
a
и b
. Некоторые другие ответы тоже говорили об этом; если в качестве входных данных задано рациональное число, вы можете просто сохранить его, чтобы оно было у вас, когда оно вам нужно. Но настоящая трудность заключается в вычислении a
и b
из числа с плавающей запятой.
- person jogojapan; 10.06.2013
c
, а программа вычисляет a
и b
. Но в любом случае... это не так важно.
- person jogojapan; 10.06.2013
Разделение обоих чисел на их HCF может помочь.
#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;
}
355/113
- person user3528438   schedule 07.10.2015