Форум программистов, компьютерный форум, киберфорум
Наши страницы
Теория и практика программирования
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.53/392: Рейтинг темы: голосов - 392, средняя оценка - 4.53
Phantom
Эксперт С++
3170 / 852 / 39
Регистрация: 29.12.2008
Сообщений: 952
#1

Нетривиальные задачи по программированию

17.06.2009, 21:49. Просмотров 70804. Ответов 132
Метки нет (Все метки)

Наверное каждый из нас сталкивался с нетривиальными задачами (на олимпиадах, в Интернете, подкидывали друзья, может у кого-то родилась своя). Речь идет не о каких-то сложных задачах, а о интересных головоломках, которые решались бы с помощью какого-нибудь нетривиального трюка, требовали соображалки и вызывали бы интерес и улыбку.
Эти задачи не забываются и я предлагаю вспомнить и выложить их здесь. Таким образом, возможно, соберется небольшой "задачник" для уважаемых форумчан. Это будет полезно. Каждый сможет размять мозг и проверить знания, решая такие задачки. В конце концов это просто забавно Чтобы не было флуда и беспорядка, попробую набросать правила топика:
* Задача должна быть действительно оригинальной и интересной, своеобразной головоломкой.
* Автор, который публикует задачу, должен располагать её решением.
* Решение задачи не должно быть слишком большим, а задача - слишком трудоемкой и требующей много времени.
* Допускаются известные и классические задачи.
* Публиковать любые решения в топике только под тегом CUT.

Начну пожалуй с задачи, которая уже встречалась на этом форуме и стала уже классической:
#0. Поменять значения двух целочисленных переменных одного типа, не используя дополнительной переменной.
#1 Написать самую короткую программу без операторов ввода и операторов работы с файлами, которая в точности выводит на экран (или на печать) свой собственный текст (исходный код).
#2 Вводятся три числа A, B и C. Нужно распечатать их по убыванию. В программе использовать только один оператор switch и ничего больше.
первая взята с форума, вторая здесь, третья моя, недавно родилась, позабавил друзей.
11
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2009, 21:49
Ответы с готовыми решениями:

нетривиальные алгоритмы
Подскажите, пожалуйста, примеры нетривиальных алгоритмов. Алгоритмы многие мне...

Задачи по программированию в С++
Не могу никак понять программирование на С++ ! Помогите решите мне хоть одну из...

задачи по программированию
Задача А. Правильное управление (Online) Задачу добавил: alef Успешно...

Задачи по программированию
Добрый вечер друзья, помогите пожалуйста с задачами по С++: 1)Дана матрица 6х6...

Олимпиадные задачи по программированию
Здравствуйте, где можно найти задача по программирования и их решение.

132
#pragma
Временно недоступен
955 / 226 / 14
Регистрация: 12.04.2009
Сообщений: 924
18.06.2009, 15:11 #2
А можно решение 3-ей (#2) задачи написать? Позабавило
Задача 3 (2#).Вариант решения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
 
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
    int x,y,z;
    cin>>x>>y>>z;
    switch
          (
            ((x<y)&&(x<z))
            ?
              (((z<y))?13:14)
            :
              (
                ((y<x)&&(y<z))
                ?
                  ((x<z)?15:16)
                :
                  (
                    ((z<x)&&(z<y))
                    ?
                      ((x<y)?17:18)
                    :
                      666 // we can continue here
                  )
              )
          )
    {
        case 13 :
             cout<<y<<endl
                 <<z<<endl
                 <<x<<endl;
        break;
        case 14 :
             cout<<z<<endl
                 <<y<<endl
                 <<x<<endl;
        break;
        case 15 :
             cout<<z<<endl
                 <<x<<endl
                 <<y<<endl;
        break;
        case 16 :
             cout<<x<<endl
                 <<z<<endl
                 <<y<<endl;
        break;
        case 17 :
             cout<<y<<endl
                 <<x<<endl
                 <<z<<endl;
        break;
        case 18 :
             cout<<x<<endl
                 <<y<<endl
                 <<z<<endl;
        break;
        case 666 :
             cout<<"Не убывающая "
                 <<"последовательность.";
    }
    return 0;
}

Таких бы задач побольше(можно тему на видное место),а то всё нудота сплошная
0
Phantom
Эксперт С++
3170 / 852 / 39
Регистрация: 29.12.2008
Сообщений: 952
18.06.2009, 15:56  [ТС] #3
#0 Ответ дан здесь

#1 Классическая задача, называется куайн/квайн и ей посвещено много статей, самая информативная - в википедии

Ответ на #2.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main()
{
    int a,b,c; cin>>a>>b>>c;
 
    switch((a>b)+2*(a>c)+2*(b>c))
    {
    case 0: cout<<c<<b<<a<<endl;break;
    case 1: cout<<c<<a<<b<<endl;break;
    case 2: cout<<b<<c<<a<<endl;break;
    case 3: cout<<a<<c<<b<<endl;break;
    case 4: cout<<b<<a<<c<<endl;break;
    case 5: cout<<a<<b<<c<<endl;break;
    }
    system("pause");
}


#pragma, спасибо, рад что понравилось. Буду и дальше искать подобные задачи, надеюсь остальные тоже поучаствуют
4
Evg
Эксперт CАвтор FAQ
19282 / 7139 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
18.06.2009, 16:38 #4
Задача не по программированию, но все те, кому её задавал, были очень рады. Задача хороша тем, что легко запоминается и решается в уме

Даны 4 числа: 1, 4, 5, 6
Нужно их написать в произвольном порядке и расставить между ними знаки операций (плюс, минус, умножить, делить) и скобки (если они нужны), чтобы результат равнялся 24. Каждое число должна быть использована ровно 1 раз. Двузначные числа составлять нельзя
Наиболее часто задаваемые вопросы:

Q: а точно должно получиться 24?
A: да

Q: а в условии задачи нет ошибок?
A: нет

Q: а задача решается?
A: да
4
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
18.06.2009, 16:57 #5
Задача как раз "по программированию" и на языке С решается элементарно
0
Evg
Эксперт CАвтор FAQ
19282 / 7139 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
18.06.2009, 17:01 #6
Цитата Сообщение от CheshireCat Посмотреть сообщение
Задача как раз "по программированию" и на языке С решается элементарно
Задача математическая. А решать её на Си - читерство. Ибо не получишь того удовольствия, которое получил бы, если бы сам её решил. Я вот тоже сам не смог, написал прогу, а потом жалел, что сам как следует мозгами не пораскинул.

Кстати, кто решит - ответ открытым текстом не пишите. дайте людям подумать
1
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
18.06.2009, 17:09 #7
Evg, я уже редактор кода открыл
ладно... попробую головой, сугубо математическим действием.
0
Haster
инженер-системотехник
111 / 110 / 5
Регистрация: 10.03.2009
Сообщений: 533
18.06.2009, 17:22 #8
#pragma, А разве ?: это не оператор? Или это операция?

Добавлено через 7 минут 54 секунды
Evg, а деление целочисленное? ))
1
Evg
Эксперт CАвтор FAQ
19282 / 7139 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
18.06.2009, 17:30 #9
Цитата Сообщение от Haster Посмотреть сообщение
Evg, а деление целочисленное? ))
В математике нет понятие целочисленное или нецелочисленное, знаковое или беззнаковое, 32-битное или 64-битное, в прямом коде или в дополнительном. В математике есть просто деление
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
18.06.2009, 17:33 #10
Evg, неужели ты подумал, что я буду писать программу?
Я могу предложить два решения, и оба простые:
1. с записью решения на языке Си (правильно, здесь используется целочисленное деление),
2. "честное математическое" решение.
0
Evg
Эксперт CАвтор FAQ
19282 / 7139 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
18.06.2009, 17:35 #11
Цитата Сообщение от CheshireCat Посмотреть сообщение
Evg, неужели ты подумал, что я буду писать программу?
Я ничего не думал Просто сразу забыл написать. Да и наверное несколько глупо было математическую задачу давать решать программистам
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
18.06.2009, 18:22 #12
Ты тогда дай сигнал, когда публиковать решения можно будет......
0
#pragma
Временно недоступен
955 / 226 / 14
Регистрация: 12.04.2009
Сообщений: 924
18.06.2009, 18:33 #13
Phantom, а в твоём коде
решения
((a>b)+2*(a>c)+2*(b>c))
если сумма равна,например,3,то какие из условий верные?1 и 3 или 1 и2?
0
Ultrator
14 / 10 / 1
Регистрация: 28.04.2009
Сообщений: 219
18.06.2009, 18:34 #14
Откройте Кнута, там таких зада-ач...
Вот, одна, помню:
Пусть заданы 3 числовые переменные: A, B, C.
Сделать так, чтобы в C появилось значение, равное min(A, B), при этом, не используя условных переходов.
0
Phantom
Эксперт С++
3170 / 852 / 39
Регистрация: 29.12.2008
Сообщений: 952
18.06.2009, 18:52  [ТС] #15
#pragma,
всё корректно.
Тройка получится в двух раскладах: (a>b)=1, (a>c)=1, (b>c)=0 или (a>b)=1, (a>c)=0, (b>c)=1. Это значит что либо a>b, a>c и b<c (это случай acb) либо a>b, c>a и b>c (это невозможно). Значит когда тройка, всего один вариант - acb.
1
Jazon_deenAlt
4111 / 986 / 191
Регистрация: 09.04.2009
Сообщений: 4,226
18.06.2009, 19:03 #16
Ultrator, ну если условный переход ето типа сравнение то
вот так как бы)
C:=(a+b)/2-|a-(a+b)/2|
а если не так то не так)
0
Evg
Эксперт CАвтор FAQ
19282 / 7139 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
18.06.2009, 19:44 #17
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ты тогда дай сигнал, когда публиковать решения можно будет......
Да мне то что Кому интересно подумать - тот подумает, кому не интересно - заглянет в ответ.

Добавлено через 3 минуты 4 секунды
ТОлько ответ через CUT спрячь
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
18.06.2009, 21:53 #18
Ок, вот вариант 1 - на языке С или С++
тут
C++
1
int result = 6 * 4 + 1 / 5;  // разумеется, целочисленное деление...

А вот вариант 2 - "честный математический":
1
Изображения
 
Evg
Эксперт CАвтор FAQ
19282 / 7139 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
18.06.2009, 21:55 #19
1. Неправильно, ибо задача математическая
2. Неправильно, ибо задача математическая и про возведение в степень не сказано (это уже работа художника, а не математика)
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
18.06.2009, 22:12 #20
Правильно, правильно.... Читаем внимательно условия задачи.
0
18.06.2009, 22:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2009, 22:12

Подскажите задачи по программированию
Всем, привет. Начал изучать C++ и qt. А задачи самому себе не придумать. Хоть...

Олимпиадные задачи по программированию
Пробуйте :) Окружной этап всероссийской олимпиады школьников по информатике...

Ищу задачи по программированию c++
Надо сборник задач по c++ Чтобы были задачи на циклы, масивы, функции....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru