Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2010, 16:48   #1
s.c.o.r.p.i.o.n.
 
Регистрация: 28.06.2010
Сообщений: 4
По умолчанию вывод периодической дроби (с/с++)

нам известен числитель и знаменатель дроби.
необходимо реализовать вывод дроби в виде:
a.b(cdef)
или вывод может иметь вид a.(abcd)
или не иметь периода
не подскажите алгоритм?
P.S. возможно рассмотреть не все числа, а определенное кол-во (ведь период может быть очень большим) скажем рассмотрим только 10 чисел после запятой.
s.c.o.r.p.i.o.n. вне форума Ответить с цитированием
Старый 28.06.2010, 21:40   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Делишь столбиком, или уголком, или как там это называют. Когда остатки начинают повторяться - это период.
Somebody вне форума Ответить с цитированием
Старый 28.06.2010, 22:25   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

window.edu.ru/window_catalog/files/r24347/2004_5_20.pdf
Carbon вне форума Ответить с цитированием
Старый 29.06.2010, 13:53   #4
s.c.o.r.p.i.o.n.
 
Регистрация: 28.06.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
window.edu.ru/window_catalog/files/r24347/2004_5_20.pdf
спасибо!
может кому понадобится алгоритм:
Код:
	unsigned int a = num; //числитель
	unsigned int b = den; //знаменатель
	int s,l(0),l1(0),k(1),r(10),p,temp[3];
	//Выделение из знаменателя дроби наибольшей степени 2
	s = den % 2;
	while (s == 0){
		b = b / 2;
		s = b % 2;
		l++;
		if (l >= 1000){
			cout << "Программа работает с числами, у которых период меньше 1000 знаков" << endl;
			cout << "Период не обнаружен" << endl;
			return;
		}
	}
	//Выделение из знаменателя дроби наибольшей степени 5
	s = den % 2;
	s = b % 5;
	while (s == 0){
		b = b % 5;
		s = b / 5;
		l1++;
		if (l1 >= 1000){
			cout << "Программа работает с числами, у которых период меньше 1000 знаков" << endl;
			cout << "Период не обнаружен" << endl;
			return;
		}
	}
	//вычисление длины периода дроби с новым знаменателем
	while (r != 1){
		r = (10*r)%b;
		k++;
	}
	if (l1>l) p=l1;
	else p=l;
	a = num;
	b = den;
	cout << "Периодическая дробь: ";
	cout << a/b << ".";
	a = a % b;
	for (int i=0; i<p;i++){//предпериод дроби
		cout << (a*10)/b;
		a = (a*10)%b;
	}

	cout << "(";
	for (int i=0; i<k;i++){// период дроби
		cout << (a*10)/b;
		a = (a*10)%b;
	}
	cout << ")" << endl;
s.c.o.r.p.i.o.n. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Десятичные дроби в С ранетка Общие вопросы C/C++ 4 21.01.2010 00:08
Период дроби Магистраль Помощь студентам 7 06.04.2009 09:11
Класс дроби на C# Лубышев Помощь студентам 6 11.10.2008 10:00
Простые дроби 4aineg Паскаль, Turbo Pascal, PascalABC.NET 5 09.12.2006 15:01