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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2011, 22:47   #1
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию перевод бесконечной переодической дроби в обыкновенную?

вот написал не сложную программу, но она не работает
Код:
#include<iostream>
#include<cmath>

using namespace std;

int main()
{
const double n = 1.2222222222222222;
int used[5];//массив значений которые уже были
for(int i=0,j=0,k=0; i<100; ++i)//перебор значений
	if(floor(i*n)/i==n)//если числитель целый и дробь равна n.    (!!!здесь находится предпоЛАГАЕМАЯ ошибка!!!)
	{
		for(k=0; k<j && i%used[k]!=0; ++k);//проверяем нельзя ли ее сократить
		if(k==j){cout<<i*n<<'/'<<i<<'='<<n<<endl;used[j++]=i;}//если нельзя, то печатаем ее и добавляем в массив used
	}
cin.get();
return 0;
}
заранее спасибо
ololo-schoolboy вне форума Ответить с цитированием
Старый 02.04.2011, 23:23   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Правило перевода бесконечной периодической дроби в обыкновенную таково:
Чтобы обратить периодическую дробь в обыкновенную, надо из числа, стоящего до второго периода, вычесть число, стоящее до первого периода и записать эту разность числителем, а в знаменателе написать цифру 9 столько раз, сколько цифр в периоде, и после девяток дописать столько нулей, сколько цифр между запятой и первым периодом.
По-моему, этот алгоритм реализовать несколько проще. Главное -- решение будет точным -)

ЗЫ Если, все-таки, решение перебором принципиально, то попробуй расставить скобки в подозрительной строчке:
Код:
if ((floor(i*n)/i)==n)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062

Последний раз редактировалось Mandrivnyk; 02.04.2011 в 23:26.
Mandrivnyk вне форума Ответить с цитированием
Старый 03.04.2011, 00:24   #3
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

спасибо, впредь постараюсь не спать на алгебре=)
хотя с if ((floor(i*n)/i)==n) все равно странно оно ни разу не бывает true
ololo-schoolboy вне форума Ответить с цитированием
Старый 03.04.2011, 00:41   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от ololo-schoolboy Посмотреть сообщение
с
хотя с if ((floor(i*n)/i)==n) все равно странно оно ни разу не бывает true
Не посмотрел.
Оно у тебя и не будет никогда true.
Сам подумай.
у тебя n имеет 16 знаков после запятой. а i доходит только до 100.
Что ты, собственно, хочешь проверить этим условием?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 03.04.2011, 13:07   #5
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

мне надо чтобы у меня был целый числитель, те i*n/i==n, если i*n -- целое, то i*n==floor(i*n), а значит floor(i*n)/i==n, по идее он должен быть true при i равном 9 или кратному 9
ololo-schoolboy вне форума Ответить с цитированием
Старый 03.04.2011, 15:55   #6
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от ololo-schoolboy Посмотреть сообщение
мне надо чтобы у меня был целый числитель, те i*n/i==n, если i*n -- целое, то i*n==floor(i*n), а значит floor(i*n)/i==n, по идее он должен быть true при i равном 9 или кратному 9
i*n при заданном тобой n = 1.2222222222222222 будет целым если i будет равно 500000000000000 (если я правильно посчитал разряды). При меньших i у тебя все равно останется "хвостик" после десятичной точки.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 03.04.2011, 16:26   #7
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

Код:
cout<<"n*9="<<n*9<<endl;//выводит 11
ololo-schoolboy вне форума Ответить с цитированием
Старый 03.04.2011, 16:49   #8
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от ololo-schoolboy Посмотреть сообщение
Код:
cout<<"n*9="<<n*9<<endl;//выводит 11
Ради интереса, попробуй
Код:
cout << ((n*9) == 11) << endl;
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 03.04.2011, 20:37   #9
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

ОК, спасибо, разобрался
ololo-schoolboy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисление бесконечной суммы ряда pyzhov Помощь студентам 7 12.12.2010 22:48
представить обыкновенную дробь в виде десятичной андреич Помощь студентам 2 19.05.2010 22:43
VS 2008 C++, задачка на вычисление бесконечной суммы Graf Xandr Помощь студентам 1 16.11.2009 20:54
Вычисление бесконечной суммы в delphi Hegel Помощь студентам 31 11.01.2009 20:49
преобразование десятичной дроби в обыкновенную и обратно, Delphi ИгорьОК Помощь студентам 4 04.04.2007 21:12