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

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

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

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

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

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

Цитата:
Сообщение от Syuf Посмотреть сообщение
Код:
Этот код:
if(sk2 == ']' && !(c % d))
		result++;
		
    ab=a/b;
    cd=c/d;
    result=(cd-ab)+result-1;
Второй - это из сообщения #6?
первый это ваш, + то что я добавил
Код:
Этот код:
if(sk2 == ']' && !(c % d))
		result++;
		
    ab=a/b;
    cd=c/d;
    result=(cd-ab)+result-1;
а второй из 6

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

[3/2, 4) должно 2
boomeer вне форума Ответить с цитированием
Старый 31.10.2010, 20:06   #13
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;
	}

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

	if(a%b && a/b > 0)
		left++;
	if(c%d && c/d < 0)
		right--;

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

	return 0;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.10.2010, 20:41   #14
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;
	}

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

	if(a%b && a/b > 0)
		left++;
	if(c%d && c/d < 0)
		right--;

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

	return 0;
}
Так проходит 9 тестов из 20... не прошло 2, 9-14, 16-19
Например [-2/4, 5/3] должно быть 2
boomeer вне форума Ответить с цитированием
Старый 31.10.2010, 21:42   #15
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;
	}

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

	if(a%b && a/(int)b > 0)
		left++;
	if(c%d && c/(int)d < 0)
		right--;

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

	return 0;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 01.11.2010, 06:49   #16
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;
	}

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

	if(a%b && a/(int)b > 0)
		left++;
	if(c%d && c/(int)d < 0)
		right--;

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

	return 0;
}
Не прошло 9, 11, 13, 14 тесты =(((
boomeer вне форума Ответить с цитированием
Старый 02.11.2010, 16:06   #17
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

Цитата:
Сообщение от boomeer Посмотреть сообщение
Не прошло 9, 11, 13, 14 тесты =(((
Нужна помощь, 4 теста так же горят, может узрит кто ошибку?
Сааамый первый доработанный вариант проходил 9 и 11 тесты
(1/2, 3] некорректно, [1/2, 3]

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

Код:
	if(a%b && a/(int)b >= 0)
		left++;
	if(c%d && c/(int)d < =0)
		right--;
Изменив на нестрогое неравенство проходит 9,11,13,14 тесты, но горит 2,10,17,18,19..
Помогите доработать предыдущий код со строгим неравенством...

Последний раз редактировалось boomeer; 02.11.2010 в 20:06.
boomeer вне форума Ответить с цитированием
Старый 05.11.2010, 13:11   #19
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

изменив вывод на
Код:
cout<< ((c%d==c)? right-left+1: (a%b==a)? right-left : right-left+1 );
прошли 9 и 11 тесты. 13 и 14 так же сгорают, знаю что если поставить еще условие
Код:
b%a==b ? right-left
прходим 13 и 14 тесты но горим на многих других
Неужели никто не знает как доделать?
boomeer вне форума Ответить с цитированием
Старый 05.11.2010, 16:48   #20
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Автор, дали бы ссылку на задачу и систему онлайн-тестирования.

Если честно, мне неохота разбирать код, приведенный выше. В этом отношении я ленив до неприличия.

Проверьте это:
Код:

#include <iostream>
#include <fstream>
#include <cctype>

typedef std::pair<char, char> IntervalType;
typedef std::pair<int, int> Fraction;

struct Interval
{
    IntervalType itype;
    Fraction left;
    Fraction right;
};

int readUInt(const std::string &str, int &i)
{
    int result = 0;
    while (isdigit(str[i]))
        result = result*10 + str[i++] - '0';
    return result;
}

Fraction readFraction(const std::string &str, int &i)
{
    Fraction result = std::make_pair(1.0, 1.0);

    if (str[i] == '-') {
        result.first = -1.0;
        ++i;
    }

    result.first *= readUInt(str, i);
    if (str[i] == '/')
        result.second = readUInt(str, ++i);

    return result;
}

Interval toInterval(const std::string &str)
{
    Interval result;
    result.itype = std::make_pair(str.at(0),
                                  str.at(str.length()-1));
    int i = 1;
    result.left = readFraction(str, i);
    i += 2;
    result.right = readFraction(str, i);

    return result;
}

int intCount(const Interval &i)
{
    int a = static_cast<int>(1.0 * i.left.first / i.left.second);
    bool isInta = i.left.first % i.left.second == 0;
    if (i.itype.first == '[' && isInta)
        --a;
    if (i.left.first < 0 && !isInta)
        --a;

    int b = static_cast<int>(1.0 * i.right.first / i.right.second);
    bool isIntb = i.right.first % i.right.second == 0;
    if (i.itype.second == ')' && isIntb)
        --b;
    if (i.right.first < 0 && !isIntb)
        --b;

    return b - a;
}

int main()
{
    std::ifstream fin("input.txt");
    std::ofstream fout("output.txt");

    std::string expr;
    std::getline(fin, expr);
    while (!fin.eof() && expr.length() != 0) {
        Interval i = toInterval(expr);
        fout << intCount(i) << std::endl;
        std::getline(fin, expr);
    }

    fin.close();
    fout.close();

    return 0;
}
Пример входного файла:
Код:
[-50/20, -10/20]
[-0/10, 50/25]
[-10/2, -0/30]
[-10/10, 3]
[-5/2, -0/30)
[1, 5/2)
[-1/2, 3)
[1, 3)
(-5/2, -1/2]
(1, 5/2]
(-1/25, 30]
(1, 3]
(-5/2, -10/20)
(0/10, 5/2)
(-1/2, 30/10)
(-4, -0/30)
still_alive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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