Решаем задачки вместе.
| |
Йакуд | Дата: Вторник, 23 Августа 2011, 19:21 | Сообщение # 21 |
участник
Сейчас нет на сайте
| Quote (Demeron) Вот ещё 1 задачка: Дается сумма и произведение 2 чисел. Найти эти числа. Ну это не интересная задача совсем. Все сводится к решению квадратного уравнения из системы. Это скорее математика, чем задания по программированию
Code // x и y даны. (система:) a*b = x; (1) a+b = y; (2)
(2) b = y-a;
(2)=>(1) a*(y-a) = x; a*y-sqr(a) = x; sqr(a) - y*a + x = 0; D = sqr((-y))-4*x;
A1 = (-y + sqrt(D))/2; A2 = (-y - sqrt(D))/2; B1 = y-A1; B2 = y-A2; Ничего сложного. Не интересно совсем. Адаптировать данный код в си проще простого...
"Хороший художник – копирует, гениальный – ворует!" — Pablo Picasso .blanco 2.0
Сообщение отредактировал Йакуд - Вторник, 23 Августа 2011, 19:25 |
|
| |
Stage | Дата: Вторник, 23 Августа 2011, 19:23 | Сообщение # 22 |
постоянный участник
Сейчас нет на сайте
| ^ это xor, а не степень
|
|
| |
Йакуд | Дата: Вторник, 23 Августа 2011, 19:26 | Сообщение # 23 |
участник
Сейчас нет на сайте
| Stage, так лучше?) Я писал не на си.. Решил математическим путем и ^ использовал для степени.. Просто эта задача совершенно не интересная... =(
"Хороший художник – копирует, гениальный – ворует!" — Pablo Picasso .blanco 2.0
|
|
| |
Stage | Дата: Вторник, 23 Августа 2011, 22:21 | Сообщение # 24 |
постоянный участник
Сейчас нет на сайте
| На императивных языках решения не слишком изящные. Тоже самое на функциональном Haskell Code func s p = [(x, y) | x <- [0..s], y <- [0..s], x + y == s, x * y == p] Quote func 8 16 Вывод: [(4,4)]
func 7 12 Вывод: [(3,4),(4,3)]
|
|
| |
мотоблох | Дата: Вторник, 23 Августа 2011, 22:33 | Сообщение # 25 |
Придворный программист
Сейчас нет на сайте
| А кто-нибудь решил мою задачу?
|
|
| |
Техник | Дата: Среда, 24 Августа 2011, 11:00 | Сообщение # 26 |
Глава X-ray Games
Сейчас нет на сайте
| Quote (Stage) Вот ещё 1 задачка: Дается сумма и произведение 2 чисел. Найти эти числа. Ну это 8-9 класс "решение систем уравнений" по математике. Вот еще одна задачка: Написать программу(консольную),реализующую процесс бронирования билетов на самолет. Допустим, общее число мест будет 50. В решении можно использовать встроенный массив,либо контейнер из STL. Принцип действия программы следующий: пользователь вводит число в диапазоне от [0..50], если это место не занято, то программа пишет "место забронировано", в противном случае "место занято". Программа перед вводом числа должна заполнить массив числами 0(не занято) и 1(занято),конечно,случайно.
|
|
| |
Demeron | Дата: Среда, 24 Августа 2011, 11:44 | Сообщение # 27 |
User created in C++
Сейчас нет на сайте
| Quote (Техник) Вот еще одна задачка: Написать программу(консольную),реализующую процесс бронирования билетов на самолет. Допустим, общее число мест будет 50. В решении можно использовать встроенный массив,либо контейнер из STL. Принцип действия программы следующий: пользователь вводит число в диапазоне от [0..50], если это место не занято, то программа пишет "место забронировано", в противном случае "место занято". Программа перед вводом числа должна заполнить массив числами 0(не занято) и 1(занято),конечно,случайно. пффф... та это вообще самые азы...
Code #include <windows.h> #include <iostream>
int mesta[50]; int mesto;
int main() { for (int i=0;i<50;i++) mesta[i]=rand()%2;
std::cin>>mesto;
if (mesta[mesto]==1) printf("mesto zanato!\n"); else printf("mesto svobodno!\n");
system("pause"); //для того что бы увидеть ответ
return 0; } Добавлено (24.08.2011, 11:44) --------------------------------------------- Предлагаю сделать так: Если кто-то решил задачку, то ему ставит плюс тот, кто задал задачу.
|
|
| |
Техник | Дата: Среда, 24 Августа 2011, 15:22 | Сообщение # 28 |
Глава X-ray Games
Сейчас нет на сайте
| Quote (Demeron) Предлагаю сделать так: Если кто-то решил задачку, то ему ставит плюс тот, кто задал задачу. Ну давайте тогда и задачки будем придумывать по-сложнее.
|
|
| |
Stas96 | Дата: Среда, 24 Августа 2011, 19:45 | Сообщение # 29 |
Programmer and Game Designer
Сейчас нет на сайте
| Quote (Техник) Вот еще одна задачка: Написать программу(консольную),реализующую процесс бронирования билетов на самолет. Допустим, общее число мест будет 50. В решении можно использовать встроенный массив,либо контейнер из STL. Принцип действия программы следующий: пользователь вводит число в диапазоне от [0..50], если это место не занято, то программа пишет "место забронировано", в противном случае "место занято". Программа перед вводом числа должна заполнить массив числами 0(не занято) и 1(занято),конечно,случайно. Вот мое решение, тоже самое что и у Demeron, только вместо if else, использую ? :. Code #include <iostream>
using namespace std;
int mesta[50]; int mesto;
int main() { for (int i = 0 ;i < 50; i++)
mesta[i]=rand()%2;
cin >> mesto;
(mesta[mesto]==1) ? cout << "mesto zanato!\n" << endl : cout << "mesto svobodno!\n"<< endl;
system("pause"); //для того что бы увидеть ответ
return 0; }
Сообщение отредактировал Stas96 - Среда, 24 Августа 2011, 19:45 |
|
| |
zodiak | Дата: Среда, 24 Августа 2011, 22:29 | Сообщение # 30 |
постоянный участник
Сейчас нет на сайте
| Че за детские задачи. Вот вам задание. Написать максимально быструю генерацию и сортировку массива состоящего из 100000 элементов типа int. Несколько условий: 1. Массив генерится рандомом, начальное значение генератора у всех должно быть одно, например 12345. 2. Время генерации и сортировки засекать функцией timeGetTime().
Quote (Demeron) Предлагаю сделать так: Если кто-то решил задачку, то ему ставит плюс тот, кто задал задачу. Давайте отмечать плюсом лучший вариант.
Также можно устанавливать время на решение, например на мою задачку до воскресения.
зы: Попробовал написать код и изменил условия. Не миллион а 100 тысяч. Мой текущий код генерит массив на 10 милисекунд а сортирует за 201 секунду.
Точка зору окремо взятого індивіда завжди суб'єктивна!
Взломщик Battle City.Net
Сообщение отредактировал zodiak - Среда, 24 Августа 2011, 22:53 |
|
| |
Kornival | Дата: Четверг, 25 Августа 2011, 04:05 | Сообщение # 31 |
The Witcher
Сейчас нет на сайте
| Quote (zodiak) Написать максимально быструю генерацию и сортировку массива состоящего из 100000 элементов типа int. Алгоритмы сортировки известны, никакого творческого подхода здесь не требуется. Как-то неинтересно строчить одно и то же в тридцатый раз Неужели никто не даст нормальную задачку...
|
|
| |
zodiak | Дата: Четверг, 25 Августа 2011, 10:46 | Сообщение # 32 |
постоянный участник
Сейчас нет на сайте
| Kornival, То, что алгоритм известен ничего не значит, его еще нужно реализовать, причем самым быстрым способом. Решая задачу кто-то сделает это в первый раз.
Выше я привел замеры в режиме отладки. В релизе цифры другие: 3 милисек генерация и 50 сек сортировка. Сортировку я немного улучшил и сейчас она занимает 30 секунд.Добавлено (25.08.2011, 10:46) --------------------------------------------- Значительно ускорил время генерации массива, сейчас она равна 0 миллисекунд. Как получить микросекунды?
Точка зору окремо взятого індивіда завжди суб'єктивна!
Взломщик Battle City.Net
|
|
| |
Demeron | Дата: Четверг, 25 Августа 2011, 11:16 | Сообщение # 33 |
User created in C++
Сейчас нет на сайте
| Quote (zodiak) Давайте отмечать плюсом лучший вариант. Лучше 1 правильный и самый быстрый. Quote (zodiak) Также можно устанавливать время на решение На разных процессорах скорость выполнения разная.
|
|
| |
Kornival | Дата: Четверг, 25 Августа 2011, 15:24 | Сообщение # 34 |
The Witcher
Сейчас нет на сайте
| Quote (zodiak) Как получить микросекунды? QueryPerfomance
|
|
| |
Pesets | Дата: Суббота, 27 Августа 2011, 01:11 | Сообщение # 35 |
постоянный участник
Сейчас нет на сайте
| Проходил мимо, вот что вспомнил... где-то с год назад мне дали линк на одну довольно интересную задачку. Щас расскажу. Вам нужно написать программу, которая управляет стеками. То есть, ей подаются команды добавить-удалить, а она, собссно, добавляет-удаляет. Стеков до 1000.
В качестве входных данных программа принимает следующий файл: В первой строчке число - N количество операций. 0 < N <= 100000 В каждой следующей строчке находится описание операции. Операции бывают двух типов: PUSH A B - добавить в стек A (1 <= A <= 1000) целое число B (0 <= B <= 10^9) POP A - убрать вершину стека A Соответственно, входной файл будет выглядеть примерно так: Code 7 PUSH 1 100 PUSH 1 200 PUSH 2 300 PUSH 2 400 POP 2 POP 1 POP 2
После выполнения каждой POP операции программа должна вывести в выходной файл какое число она убрала с вершины стека. То есть, для входного файла описанного выше ответ будет таким:
Вот. Казалось бы, что такого? Задача простейшая... но! Программа должна использовать не более 750Кб оперативки и работать не дольше 1с. Я ломал голову весь вечер, но нашел-таки такое решение, которое удовлетворяло обоим ограничениям. Интересно, кто-нибудь еще сможет?)
|
|
| |
Kornival | Дата: Суббота, 27 Августа 2011, 02:54 | Сообщение # 36 |
The Witcher
Сейчас нет на сайте
| Решал чуть меньше часа, за производительностью особо не гнался, пожалуйста замерь и дай знать если не справился с каким-нибудь из условий. Вот код: Code #include <stdio.h> #include <stdlib.h> #include <string.h>
#define PUSH 0 #define POP 1
FILE *input; FILE *output;
class stack { public: stack() {_iterator = 10000;} void push(int x); int pop(); private: int _data[10000]; int _iterator; }; stack *my_stack; struct task { int _task; int _stack_number; int _value; }; task current_task; void stack::push(int x) { if(_iterator) { _iterator--; _data[_iterator] = x; } }
int stack::pop() { int ret_value; if(_iterator < 10000) { ret_value = _data[_iterator]; _iterator++; } return ret_value; }
void get_task(char *str) {
char *p; //первая лексема-действие которое необходимо выполнит p = strtok(str, " "); if(!strcmp(p,"PUSH")) current_task._task = PUSH; else current_task._task = POP;
//вторая лексема-номер задействованного стека p = strtok('\0'," "); current_task._stack_number = atoi(p) - 1;
//третья лексема-значение, которое должно быть записано в стек(если PUSH) p = strtok('\0'," "); if(current_task._task == PUSH) current_task._value = atoi(p);
}
void perform_task() { char buffer[30]; if(current_task._task == PUSH) { my_stack[current_task._stack_number].push(current_task._value); return; } else { itoa(my_stack[current_task._stack_number].pop(),buffer,10); fputs(buffer,output); fputc('\n',output); printf("%s\n",buffer); }
}
int main() { int num_of_operations;
char buffer[30]; input = fopen("input.txt","r"); output = fopen("output.txt","w"); //количество операций == количество требуемых(максимально) стеков num_of_operations = atoi(fgets(buffer,sizeof(buffer),input)); my_stack = new stack[num_of_operations];
while(fgets(buffer,sizeof(buffer),input)) { get_task(buffer); perform_task(); } itoa(my_stack[1].pop(),buffer,10);
return 0; }
Сообщение отредактировал Kornival - Суббота, 27 Августа 2011, 03:22 |
|
| |
Pesets | Дата: Суббота, 27 Августа 2011, 03:05 | Сообщение # 37 |
постоянный участник
Сейчас нет на сайте
| Code b1bae136-b6a5-4516-ae7b-66f18dfa10a1 b1bae136-b6a5-4516-ae7b-66f18dfa10a1(24) : error C2380: type(s) preceding 'task' (constructor with return type, or illegal redefinition of current class-name?) b1bae136-b6a5-4516-ae7b-66f18dfa10a1(35) : error C2274: 'function-style cast' : illegal as right side of '.' operator b1bae136-b6a5-4516-ae7b-66f18dfa10a1(36) : error C2274: 'function-style cast' : illegal as right side of '.' operator b1bae136-b6a5-4516-ae7b-66f18dfa10a1(44) : error C2274: 'function-style cast' : illegal as right side of '.' operator b1bae136-b6a5-4516-ae7b-66f18dfa10a1(70) : error C2084: function 'void get_task(char *)' already has a body b1bae136-b6a5-4516-ae7b-66f18dfa10a1(29) : see previous definition of 'get_task' b1bae136-b6a5-4516-ae7b-66f18dfa10a1(75) : error C2274: 'function-style cast' : illegal as right side of '.' operator b1bae136-b6a5-4516-ae7b-66f18dfa10a1(76) : error C2274: 'function-style cast' : illegal as right side of '.' operator b1bae136-b6a5-4516-ae7b-66f18dfa10a1(84) : error C2274: 'function-style cast' : illegal as right side of '.' operator b1bae136-b6a5-4516-ae7b-66f18dfa10a1(92) : error C2274: 'function-style cast' : illegal as right side of '.' operator b1bae136-b6a5-4516-ae7b-66f18dfa10a1(120) : error C3861: 'get_task': identifier not found
PS Я бы дописал, но все-таки это твоя прога)Добавлено (27.08.2011, 03:05) --------------------------------------------- PPS Прога скорее всего завалится, тк в стеке может быть макс 10 000 элементов, а за 100 000 операций можно положить 100 000 элементов в один стек
Сообщение отредактировал Pesets - Суббота, 27 Августа 2011, 03:01 |
|
| |
Kornival | Дата: Суббота, 27 Августа 2011, 03:06 | Сообщение # 38 |
The Witcher
Сейчас нет на сайте
| У меня в кодеблокс нормально собирается? У тебя VC++?
|
|
| |
Pesets | Дата: Суббота, 27 Августа 2011, 03:08 | Сообщение # 39 |
постоянный участник
Сейчас нет на сайте
| Не у меня. У тестирующей системы. По стандарту писать надо. И itoa у тебя не по POSIX'у И по-моему у нее там gcc
Сообщение отредактировал Pesets - Суббота, 27 Августа 2011, 03:08 |
|
| |
Kornival | Дата: Суббота, 27 Августа 2011, 03:11 | Сообщение # 40 |
The Witcher
Сейчас нет на сайте
| Quote (Pesets) а за 100 000 операций можно положить 100 000 элементов в один стек Всмысле завалится? 100 000-максимальное количество операций, а значит и максимально количество элементов во всех стеках.Добавлено (27.08.2011, 03:11) --------------------------------------------- У меня gcc прекрасано собирает, сейчас посмотрю что можно сделать.
|
|
| |
|