Как записать дробь в c
Перейти к содержимому

Как записать дробь в c

  • автор:

Как записать натуральную дробь?

Привести натуральную дробь к несократимому виду
1) Описать процедуру Socr(a,b,p,q) от целых параметров (b \neq 0), которая приводит дробь a/b к.

Записать как обычную математическую дробь
а) Записать как обычную математическую дробь 0,0123456789Е+0,7 б) Сколько байтов занимает.

Как написать класс «несократимая дробь» (т.е. дроби 2/4, 4/8 и т.п. есть дробь 1/2)?
Я только начанаю знакомство с C++. В классе реализовать следующие методы: конструкторы (по.

Как сделать натуральную сортировку одномерного массива?
В языке PHP есть функция natsort() которая сортирует массив используя алгоритм "natural order".

6277 / 3562 / 898
Регистрация: 28.10.2010
Сообщений: 5,926

Inkvizzz, в смысле? В C нет дробей, есть числа с плавающей точкой, 5/9 так и запишите, если хотите, чтобы деление происходило на цело, иначе 5.0 / 9.0.

Эксперт PHP

4877 / 3880 / 1609
Регистрация: 24.04.2014
Сообщений: 11,371
числитель или знаменатель должен иметь вещественный тип.
Например 5.0/9 или ((double)5)/9
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как найти натуральную величину треугольника способом замены плоскостей проекций
Как найти натуральную величину треугольника способом замены плоскостей проекций

Рекурсия: возвести число А в натуральную степень n за как можно меньшее количество умножений
Задание такое: Возвести число А в натуральную степень n за как можно меньшее количество умножений.

Умножить дробь на дробь и получить ответ в виде несократимой дроби
Даны две дроби A/B и C/D (где А, В, С, D — натуральные числа). Умножить дробь на дробь и получить.

Рациональную дробь перевести в цепную дробь
procedure Express; var a,b,t: integer; q: char; begin repeat writeln (‘введите числитель=’);.

Процедура возведения в натуральную степень
Помогите решить 2 задачи и обьяснить их,а то я их понять не могу=( 1.Алгоритм сложности O(N). Дан.

Возвести натуральное число в натуральную степень
Напишите программу, которая вводит натуральные числа A и N и вычисляет A N . По теме циклы ! .

Как записать дробь в c

как на языке c++ записать дробь

автор: cheops (05.09.2007 в 10:51) письмо автору

Под дробью что подразумевается? Число с плавающей точкой?

автор: lipid (05.09.2007 в 18:37) письмо автору

не знаю как это правильно сформулировать это просто обычная дробь сверху числитель снизу знаменатель

автор: cheops (05.09.2007 в 23:21) письмо автору

Хм. ну как обычно в арифметике принято

double drob = 346/23;

автор: Trianon (07.09.2007 в 09:27) письмо автору

double fraction = 346./23;

Акцент не на имени, конечно, а на точке.

автор: oleg_alexeev (05.09.2007 в 23:50) письмо автору

public :
Fraction ( const Fraction &);
Fraction ( int numer, int denom);

Примеры подобных классов можно найти, погуглив по ключевым словам «fraction», «numerator», denominator», «C++» и «class».

Перевод десятичной дроби в обыкновенную

Предполагается, что введенная десятичная дробь не имеет целой части.
Для решения задачи воспользуемся двумя переменными, представляющими собой числитель и знаменатель дроби.
Поиск решения будет состоять из двух этапов:

  • Поиск приближенного решения
  • Уточнение решения до получения требуемой точности

На первом этапе принимаем начальные значения числителя и знаменателя равными 1. На каждом шаге увеличиваем на 1 значение знаменателя и находим дробь
Числитель / Знаменатель
При первой итерации знаменатель равен 1 , и 1/1=1 , и это значение больше введенной десятичной дроби. Увеличиваем знаменатель на 1 до тех пор пока не получим
Числитель / Знаменатель — ВведеннаяДробь < 0

Таким образом, мы нашли первое приближение. Мы знаем, что введенная дробь соответствует обыкновенной дроби между
Числитель / (Знаменатель — 1) и Числитель / Знаменатель

На втором этапе умножим числитель и знаменатель полученного первого приближения на множитель, который будет принимать последовательно значения 2, 3, 4 и т.д
Снова, увеличивая знаменатель на 1, получим следующее приближение, и если оно устроит нас по точности, то будем считать, что найдена искомая обыкновенная дробь.

Реализация на C++

#include
using namespace std;
void func( do uble num, do uble eps, int &ch, int &zn)
int a = 1; int b = 1;
int mn = 2; // множитель для начального приближения
int iter = 0;
ch = a; zn = b;
// Поиск начального приближения
do uble c = 1;
do b++;
c = ( do uble )a / b;
> while ((num — c) < 0);
if ((num — c) < eps)
ch = a; zn = b;
return ;
>
b—;
c = ( do uble )a / b;
if ((num — c) > -eps)
ch = a; zn = b;
return ;
>
// Уточнение
while (iter < 20000)
int cc = a*mn, zz = b*mn;
iter++;
do zz++;
c = ( do uble )cc / zz;
> while ((num — c) < 0);
if ((num — c) < eps)
ch = cc; zn = zz;
return ;
>
zz—;
c = ( do uble )cc / zz;
if ((num — c) > -eps)
ch = cc; zn = zz;
return ;
>
mn++;
>
>
int main()
do uble inp;
int ch, zn;
do uble eps = 0.0000001;
cout cin >> inp;
func(inp, eps, ch, zn);
cout cin.get(); cin.get();
return 1;
>

Результат выполнения
Преобразование десятичной дроби в обыкновенную
Преобразование десятичной дроби в обыкновенную
Преобразование десятичной дроби в обыкновенную

Комментариев к записи: 2

Написание класса Дроби на C++

Это довольно классическая задача, которая рано или поздно встречается каждому программисту. Я думаю, вы знаете, что компьютер не хранит вещественные числа точно и что погрешности, как правило вызванные округлением, имеют свойство накапливаться, а потому даже небольшая погрешность потенциально может сильно исказить результат арифметических операций.

Именно из-за этого класс Дроби часто необходим при работе с большими вычислениями, поскольку помогает хранить дробные числа точно (в виде двух целых чисел) и производить промежуточные расчёты без накопления погрешности.

Новый тип данных Fraction будет иметь два поля — числитель (numerator) и знаменатель (denominator). Знак будет храниться в числителе.

class Fraction < public: int numer, denom; Fraction(int n = 0, int d = 1) < //конструктор, на вход подаются два числа n и d numer = n; denom = d; >>

Если на входе одно число, оно записывается в числитель, а знаменатель по умолчанию равен 1. В этом случае мы получаем обычное целое число. Если объект создаётся без входных параметров, по умолчанию создаётся число 0.

Арифметические операции для дробей будем реализовывать с помощью перегрузки соответствующих операторов:

Fraction operator + (Fraction& other)

Вычитание выполняется как сложение с отрицательным числом:)

Fraction operator — (Fraction& other)

Умножение и деление (умножение на «перевёрнутую дробь»)

Fraction operator * (Fraction& other) < return Fraction( numer * other.numer, denom * other.denom ).reduce(); >Fraction operator / (Fraction& other)

Почти готово. Осталось прописать ввод/вывод дроби, и, самое интересное — сокращение дроби до несократимой. Для этого напишем функции input, show и reduce.

Начнём с сокращения: дробь станет несократимой, если числитель и знаменатель поделить на их НОД, поэтому его сначала нужно найти. Есть разные способы это сделать, я применю рекурсию (алгоритм Евклида):

int fract_nod(int a, int b)

Здесь важно, чтобы a было больше или равно b, а также чтобы числа были положительны, но это мы учтём в самой функции reduce.

Fraction reduce() < int a = max(abs(numer), abs(denom)), b = min(abs(numer), abs(denom)); int sgn; //знак нашей дроби if (numer * denom >= 0) sgn = 1; else sgn = -1; int nod = fract_nod(a, b); return Fraction(sgn * (abs(numer) / nod), abs(denom) / nod); >

Теперь нужно встроить эту функцию в операции сложения и умножения так, чтобы конечный результат был несократимой дробью:

Fraction operator + (Fraction& other) < return Fraction( numer * other.denom + denom * other.numer, denom * other.denom ).reduce(); //новое >
Fraction operator * (Fraction& other) < return Fraction( numer * other.numer, denom * other.denom ).reduce(); //новое >

Напишем функцию вывода:

void show() < cout << "\t" << numer; if (denom != 1) cout << "/"

Логично вводить дроби в том же формате, что и выводить, т.е. в виде m/n, где m — целое число, а n — натуральное. Поскольку мы пишем класс на плюсах, придётся повозиться со считыванием строки и преобразованием её в два числа (возможно, с отрицательным знаком).

Fraction input(string& s) < int n = 0, d = 0, deg = 0; int slash_pos = s.find('/'); //ищем разделитель if (slash_pos != s.npos) < //если он есть (число введено как дробь) int i = slash_pos - 1; //записываем в n число перед "/" while (i >-1) < if (s[i] != '-') n += (s[i] - 48) * pow(10, deg++); //сдвиг на 48, т.к. код "0" в ASCII = 48 else n = -n; i -= 1; >deg = 0; i = s.size() - 1; //записываем в d число после "/" while (i > slash_pos) < if (s[i] != '-') d += (s[i] - 48) * pow(10, deg++); else d = -d; i -= 1; >> else < //если число введено как целое d = 1; int i = s.size() - 1; while (i >-1) < if (s[i] != '-') n += (s[i] - 48) * pow(10, deg++); else n = -n; i -= 1; >> //создаём дробь с введёнными числами и сокращаем Fraction f; if (d) f = Fraction(n, d).reduce(); else f = Fraction(n); return f; >

Код целиком

#include #include using namespace std; int fract_nod(int a, int b) < if (b == 0) return a; return fract_nod(b, a % b); >class Fraction < public: int numer, denom; Fraction(int n = 0, int d = 1) < numer = n; denom = d; >Fraction reduce() < int a = max(abs(numer), abs(denom)), b = min(abs(numer), abs(denom)); int sgn; if (numer * denom >= 0) sgn = 1; else sgn = -1; int nod = fract_nod(a, b); return Fraction(sgn * (abs(numer) / nod), abs(denom) / nod); > void show() < cout Fraction operator + (Fraction& other) < return Fraction( numer * other.denom + denom * other.numer, denom * other.denom ).reduce(); >Fraction operator - (Fraction& other) < return Fraction(numer, denom) + Fraction(-other.numer, other.denom); >Fraction operator * (Fraction& other) < return Fraction( numer * other.numer, denom * other.denom ).reduce(); >Fraction operator / (Fraction& other) < return Fraction(numer, denom) * Fraction(other.denom, other.numer); >>; Fraction input(string& s) < int n = 0, d = 0, deg = 0; int slash_pos = s.find('/'); if (slash_pos != s.npos) < int i = slash_pos - 1; while (i >-1) < if (s[i] != '-') n += (s[i] - 48) * pow(10, deg++); else n = -n; i--; >deg = 0; i = s.size() - 1; while (i > slash_pos) < if (s[i] != '-') d += (s[i] - 48) * pow(10, deg++); else d = -d; i--; >> else < d = 1; int i = s.size() - 1; while (i >-1) < if (s[i] != '-') n += (s[i] - 48) * pow(10, deg++); else n = -n; i--; >> Fraction f; if (d) f = Fraction(n, d).reduce(); else f = Fraction(n); return f; >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *