|
|
|
Junior Member
      
участник
Last Login: 29.03.2008 22:59
Сообщ.: 11,
Visits: 123
|
|
| Как осуществить вывод чисел в виде обыкновенных дробей в С++?
|
|
|
|
|
Supreme Being
      
участник
Last Login: позавчера @ 13:49
Сообщ.: 247,
Visits: 2 371
|
|
| скорее всего придется вручную преобразовывать. Хотя может логичнее будет изначально операции производить в простых дробях (опять же вручную их предварительно реализовав)
|
|
|
|
|
Supreme Being
      
участник
Last Login: 23.08.2008 19:49
Сообщ.: 1 577,
Visits: 17 092
|
|
Обычно здесь советуют использовать разложение в цепную дробь. Вот я попробовал дробь из семи звеньев.#include <stdio.h> typedef struct { __int64 num, denom; } Tq; #define N 7 void to_frac(double a, Tq *pq) { int i; int m; __int64 ii, temp[N]; m = a < 0; if(m) a = -a; for(i=0; i < N; i++) { temp[i] = a; a = 1.0 / (a - temp[i]); } pq->denom = 0; pq->num = 1; for(i=N; i-- > 0;) { ii = temp[i] * pq->num + pq->denom; pq->denom = pq->num; pq->num = ii; } if(m) pq->num = -(pq->num); }int main() { Tq q; double a; a = -3.2435; to_frac(a, &q); printf("%lf", a); printf("%I64d / %I64d", q.num, q.denom); printf("%lf", (double)q.num / q.denom); return 0; } // -3.243500 // -1372 / 423 // -3.243499 Можете оценить точность. Если хотите сделать количество звеньев как параметр функции, то придется выделять память для массива temp переменного размера, а потом ее освобождать.
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
А может стоит попробовать найти наибольший общий делитель?
Скажем есть десятичная дробь: 0.75, что есть: 75/100 ищем НОД для 75 и 100 -> 25
Делим 75 : 25 -> 3, 100 : 25 -> 4
Получаем дробь: 3/4
Подробнее о НОД: http://ru.wikipedia.org/wiki/Наибольший_общий_делитель
Удачи,
Владимир
|
|
|
|