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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2010, 21:07   #1
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию Промежутки

На вход подается интервал, полуинтервал или отрезок.
( (x, y) or [x, y) or (x, y] or [x, y] )
Где х представлено как a/b, у как c/d. a, c -целые, b, d - положительные.
Если b и (или) d ==1 то записывается просто a и (или ) c.
Промежуток задается так: открывается квадратная или круглая скобка, далее записано число x в формате a/b или a, затем запятая и пробе, затем число y в таком же формате, после закрывается скобка, перевод строки и конец файла. Abs(a) abs(c)<=10^9. 0<d, b<=10^9
Найти количество целых чисел в промежутке.
На входе [3/2, 4) на выходе 2
На входе [-2, 4/3] на выходе 4

Помогите плз понять как сделать, что то даже не пойму как организовать анализ ввода. Но кажется нужно приводить к общему знаменателю.
Вроде первый раз без своего кода создаю тему, но не въеду что то совсем...
boomeer вне форума Ответить с цитированием
Старый 30.10.2010, 21:48   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Я бы организовал ввод так:
Код:
#include <cstdio>
#include <cstring>

int main()
{
	char str1[128], str2[128];
	scanf("%s%s", str1, str2);

	int a, c;
	unsigned b, d;
	char sk1, sk2;

	if(strchr(str1, '/'))
		sscanf(str1, "%c%d/%u,", &sk1, &a, &b);
	else
	{
		sscanf(str1, "%c%d,", &sk1, &a);
		b = 1U;
	}
	if(strchr(str2, '/'))
		sscanf(str2, "%d/%u%c", &c, &d, &sk2);
	else
	{
		sscanf(str2, "%d%c", &c, &sk2);
		d = 1U;
	}

	unsigned result(0);
	if(sk1 == '[' && !(a % b))
		result++;

	// Тут код подсчета...

	printf("%u", result);

	return 0;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.10.2010, 11:48   #3
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
Я бы организовал ввод так:
Код:
#include <cstdio>
#include <cstring>

int main()
{
	char str1[128], str2[128];
	scanf("%s%s", str1, str2);

	int a, c;
	unsigned b, d;
	char sk1, sk2;

	if(strchr(str1, '/'))
		sscanf(str1, "%c%d/%u,", &sk1, &a, &b);
	else
	{
		sscanf(str1, "%c%d,", &sk1, &a);
		b = 1U;
	}
	if(strchr(str2, '/'))
		sscanf(str2, "%d/%u%c", &c, &d, &sk2);
	else
	{
		sscanf(str2, "%d%c", &c, &sk2);
		d = 1U;
	}

	unsigned result(0);// тут
	if(sk1 == '[' && !(a % b))//тут
		result++;//тут

	// Тут код подсчета...

	printf("%u", result);

	return 0;
}
Не понимаю что обозначает 1U и там ^ не понятно...

Последний раз редактировалось boomeer; 31.10.2010 в 11:50.
boomeer вне форума Ответить с цитированием
Старый 31.10.2010, 13:54   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Не понимаю что обозначает 1U и там ^ не понятно...
Суффикс u для целочисленных литерал определяет число как unsigned int.
Что за "^"?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.10.2010, 18:35   #5
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

Код:
unsigned result(0);// тут
	if(sk1 == '[' && !(a % b))//тут
		result++;//тут
Всмысле указание что тут не понятно, конкретно 2я строчка
Там же еще закрывающая еще должна анализироваться запутался я с этой задачкой

Последний раз редактировалось boomeer; 31.10.2010 в 18:42.
boomeer вне форума Ответить с цитированием
Старый 31.10.2010, 18:59   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Там же еще закрывающая еще должна анализироваться
Логично, я просто начал код подсчета, чтобы было понятно в какую сторону идти.
{В result хранится результат}

Можно, конечно, и как-то так:
Код:
#include <cstdio>
#include <cstring>

int main()
{
	char str1[128], str2[128];
	scanf("%s%s", str1, str2);

	int a, c;
	unsigned b, d;
	char sk1, sk2;

	if(strchr(str1, '/'))
		sscanf(str1, "%c%d/%u,", &sk1, &a, &b);
	else
	{
		sscanf(str1, "%c%d,", &sk1, &a);
		b = 1U;
	}
	if(strchr(str2, '/'))
		sscanf(str2, "%d/%u%c", &c, &d, &sk2);
	else
	{
		sscanf(str2, "%d%c", &c, &sk2);
		d = 1U;
	}

	int left(a/(int)b), right(c/(int)d);
	if(sk1 == '(' && !(a % b))
		left++;
	if(sk2 == ')' && !(c % d))
		right--;

	printf("%d\n", (right-left >= 0 ? right-left+1 : 0));

	return 0;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Stilet; 31.10.2010 в 19:17.
Syuf вне форума Ответить с цитированием
Старый 31.10.2010, 19:16   #7
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

При отправке на онлайн систему проверки, откуда и была взята задача, первый (доработыный) вариант не проходит 2,4,10,12-20 тесты. Второй вариант не проходит 1,9,11,13,14,16,20...

Последний раз редактировалось boomeer; 31.10.2010 в 19:33.
boomeer вне форума Ответить с цитированием
Старый 31.10.2010, 19:30   #8
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Код:
if(sk2 == ']' && !(c % d))
		result++;
		
    ab=a/b;
    cd=c/d;
    result=(cd-ab)+result-1;
Добавил.
При [-2, 4/3] неверно, при [-2/4, 5/3]....
Логично. Откуда вы это взяли?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.10.2010, 19:35   #9
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
Логично. Откуда вы это взяли?
Что именно взял? =)
boomeer вне форума Ответить с цитированием
Старый 31.10.2010, 19:42   #10
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Что именно взял? =)
Код:
Этот код:
if(sk2 == ']' && !(c % d))
		result++;
		
    ab=a/b;
    cd=c/d;
    result=(cd-ab)+result-1;
Цитата:
первый (доработыный) вариант не проходит 2,4,10,12-20 тесты. Второй вариант не проходит 1,9,11,13,14,16,20...
Второй - это из сообщения #6?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Промежутки boomeer Помощь студентам 2 03.11.2010 09:02
Промежутки между ячейками (td) таблицы _PROGRAMM_ HTML и CSS 4 10.01.2010 22:59
Промежутки времени SatiriK(rus) SQL, базы данных 4 19.11.2008 00:37