Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Интересные и занимательные задачи по программированию > Решаем интересные задачи


Автор: Антоха 17.11.2006, 00:16
Извените если не там создал тему, но ничего более подходящего не нашёл. Предлагаю здесь писать интересные математические и пр. задачи для нахождения их решения с помощью разных языков программирования(пишите решения здесь, на том языке который Вам ближе). И предлагаю закрепить эту тему, т.к. мне кажется особенно для начинающих программистов очень полезно поломать голову впринципе не над сложными задачками, для развития  мышления. А может ктото просто просматривая решения в этой теме чтото новое поймёт для себя. Извините если бонально, но я сам начинающий программист и мне кажется такие задачки помогают тренировать свои мозги smile
Ну раз я создал тему я и начну:
Задача №1: 
Бутылка с пробкой стоит 11 копеек. 
Бутылка на 10 копеек дороже пробки. 
Сколько стоит пробка? 

Я сделал эту задачку на VBA:
Код

Sub prov()
For i = 0 To 1 Step 0.01
a = i + 10
b = i + (i + 10)
If b = 11 Then
MsgBox a 'Выводи цену бутылки
End If
Next i
End Sub



Задача №2(посложнее):
Два города А и В находятся на расстоянии 300 км друг от друга.Из этих городов 
одновременно выезжают друг другу навстречу 2 велосипедиста и едут,не останавливаясь, 
cо скоростью 50 км/ч.Вместе с первым велосипедистом из города А вылетела муха, 
пролетающая в час 100 км.Муха опережает первого велосипедиста,летит навстречу второму. 
Встретив его,она сразу поварачивает назад к первому.Повстречав его,опять летит обратно 
навстречу велосипедисту В,и так продолжалось до тех пор пока велосипедисты не 
встретились. 
Сколько километров пролетела муха? 

Пока решаю... Ждём Ваших задачек smile

Автор: Fazil6 17.11.2006, 00:33
Задача№1
а чего так сложно?
Пробка = (11 - 10)/2

Добавлено @ 00:47 
Код

#include <iostream>
int main()
{
    const int a = 50;
    const int b = 50;
    const int s = 300;
    const int m = 100;

    int t = s/(a + b);   

    std::cout << "Muh proletel " << t*m << " km.";

    return 0;
}

Автор: Антоха 17.11.2006, 02:05
Цитата(Fazil6 @  17.11.2006,  00:33 Найти цитируемый пост)
Задача№1
а чего так сложно?
Пробка = (11 - 10)/2

Ты прав! Но не я не сразу до этого додумался например, и мне интересней чем считать это написать код, надо ведь с малого начинать чтобы мозги расшивеливать smile

Ещё задача:
Запишем треугольником числа (в n-й строке стоит n чисел n): 
1 
2 2 
3 3 3 
4 4 4 4 
... 
Теперь выписываем их в строку сверху вниз, получаем: 1 2 2 3 3 3 4 4 4 4 .... 
Какое число стоит на К-ом месте? К-произвольно введённое пользователем число.



Автор: Dude03 17.11.2006, 11:07
Вроде бы вот так 
Код

#include <stdio.h>
int main(void)
{
    int K, n;
    scanf("%d", &K);
    for(n = 1; K > n; n++) K -= n;
    printf("%d", n);
        return 0;
}

Автор: Sartorius 17.11.2006, 11:15
 Антоха,  молодец, поток полезный smile 
Вот вам еще задачка smile :
Дано три кувшина 10, 7 и 3 литра. Первый полностью заполнен молоком ... Пользуясь только этими тремя кувшинами разделить молоко пополам.

Автор: Fazil6 17.11.2006, 12:00
Цитата

Ты прав! Но не я не сразу до этого додумался например, и мне интересней чем считать это написать код, надо ведь с малого начинать чтобы мозги расшивеливать

Прежде чем бросаться программировать, задачу нужно тщательно продумать.

Автор: Антоха 17.11.2006, 22:38
Цитата(Sartorius @  17.11.2006,  11:15 Найти цитируемый пост)

Дано три кувшина 10, 7 и 3 литра. Первый полностью заполнен молоком ... Пользуясь только этими тремя кувшинами разделить молоко пополам.

Не понял маленько. Т.е. добиться чтобы в первом кувшине осталось 5 литров?! Или чтобы в каждом было ровно по половине?

Цитата(Fazil6 @  17.11.2006,  12:00 Найти цитируемый пост)
Прежде чем бросаться программировать, задачу нужно тщательно продумать. 

Хороший совет, спасибо, так и буду делать. Не судите строго, ведь учусь только. А к советам всегда прислушиваюсь!

Вот ещё задачка:
Несколько кружков разных размеров уложены друг на друга, образуя башню. Башня стоит на одном из трех полей. Задача- переставить ее на другое поле. 

user posted image

Но просто переставлять башню неинтересно-никакой задачи тут нет. Чтобы задание было не таким простым, нужны какике-то правила. Вот они:
  
1). Кружки переставляются с одного поля на другое, при этом их укладывают друг на друга, так что получаются маленькие башни. Нельзя откладывать кружки в сторону или ставить один кружок вместо другого.
2).При каждом ходе двигается только один кружок. Нельзя переносить несколько кружков одновременно.
3).Нельзя брать кружок из середины башни.
4) Запрещено класть больший кружок на меньший. 

Автор: Антоха 26.11.2006, 23:44
Квадратный корень
Ограничение времени: 1.0 секунды
Ограничение памяти: 16 МБ


Число x называется квадратным корнем числа a по модулю n (root (a, n)) тогда и только тогда когда 

x * x = a (mod n) 
Напишите программу, которая находит все значения квадратных корней числа a по модулю n. 

Исходные данные
В первой строке находится одно число K – количество тестов (K <= 100000). 
Каждая следующая строка представляет собой отдельный тест, который содержит два числа – a и n (a, n – натуральные, 1 <= a, n <= 32767, n простое, a и n – взаимно простые).

Результат
Для каждого теста программа должна вычислить все возможные значения root (a, n) в диапазоне (0,n-1) и вывести их в возрастающем порядке в одной строке, разделяя одним пробелом. Если для текущего теста корней не существует, программа должна вывести в отдельной строке сообщение ‘No root’.

Пример исходных данных
5
4 17
3 7
2 7
14 31
10007 20011

Пример результата
2 15
No root
3 4
13 18
5382 14629


Автор: Антоха 27.11.2006, 00:09
Когда Вито Маретти пишет важное письмо, он его шифрует. Не очень надежным методом, но достаточным для того, чтобы ни один детектив не понял ни слова. Шефу полиции такое положение дел очень не нравится. Он хочет взломать шифр Вито и обещает забыть о всех Ваших грехах, если Вы сделаете это для него. Детективы расскажут Вам, как устроен шифр. 

В шифре каждое слово шифруется отдельно. Рассмотрим шифрование на примере слов, состоящих только из строчных латинских букв. 

В начале каждая буква заменяется соответствующим ей числом: a на 0, b на 1, c на 2, ..., z на 25. После этого к первому числу добавляется 5, ко второму числу добавляется первое число, к третьему — второе и т.д. После этого если какое-то число превосходит 25, то оно заменяется остатком от деления этого числа на 26. И, наконец, числа обратно заменяются буквами. 

Зашифруем слово secret: 

Шаг 0.   s   e   c   r   e   t
Шаг 1.   18  4   2   17  4   19
Шаг 2.   23  27  29  46  50  69
Шаг 3.   23  1   3   20  24  17
Шаг 4.   x   b   d   u   y   r


В итоге получилось слово xbduyr. 

Исходные данные
Дано зашифрованное слово, состоящее из строчных латинских букв, длиной не более 100 символов. 

Результат
Выведите исходное слово. 

Пример исходных данных
xbduyr

Пример результата
secret


Автор: ivashkanet 30.11.2006, 18:23
Цитата(Антоха @  17.11.2006,  01:05 Найти цитируемый пост)
Запишем треугольником числа (в n-й строке стоит n чисел n): 
1 
2 2 
3 3 3 
4 4 4 4 
... 
Теперь выписываем их в строку сверху вниз, получаем: 1 2 2 3 3 3 4 4 4 4 .... 
Какое число стоит на К-ом месте? К-произвольно введённое пользователем число.

Математика:
n-ая цифра начинается с n(n-1)/2 +1 месте (можете проверить)

Осталось в целых числах решить неравенство:
n(n-1)/2 +1 <= k < n(n+1)/2 +1
Решаем и получаем, что
 n принадлежит [(-1 + sqrt(1+8k))/2 ; (1 + sqrt(1+8k))/2)


Автор: SelenIT 4.12.2006, 00:28
Цитата(Антоха @  17.11.2006,  00:16 Найти цитируемый пост)
Задача №2(посложнее):
Два города А и В находятся на расстоянии 300 км друг от друга.Из этих городов 
одновременно выезжают друг другу навстречу 2 велосипедиста и едут,не останавливаясь, 
cо скоростью 50 км/ч .... и так продолжалось до тех пор пока велосипедисты не 
встретились. 
Сколько километров пролетела муха?

Велосипедисты сближаются со скоростью 100 км/ч (терминаторы, не иначе;), поэтому встретятся они через 300/100 = 3 часа после старта, стало быть, муха, вне зависимости от ее траектории, налетает к этому моменту 3*100 = 300 км.

Автор: AligatorV 5.12.2006, 21:08
Ученые астрономы, сообщили правительство, что ровно через T секунд на
планете Олимпиада начнется метеоритный дождь. Правительство планеты срочно
начало эвакуацию людей и
важного оборудования - телескопических установок.
Для защиты телескопу его нужно транспортировать в специально отведенное
место - хранилище. В одном хранилище может вместиться лишь один телескоп.
Необходимо рассчитать максимальное количество телескопов которые можно
успеть спрятать к началу метеоритного дождя.

Входные данные (файл METEOR.DAT):
В первой строке число T - количество секунд через которую метеориты
упадут на планету.
Во второй строке число N - количество телескопов.
В третьей строке находится 2*N чисел - координаты телескопов (x, в)
В четвертой строке число M - количество хранилищ.
В пятой строке находится 2*M чисел - координаты хранилищ (x, в)
В шестой строке число V - скорость транспортировки телескопов.

Примечание:
0<T<1000000 ; 0<N,M<100 ; -30000 <= x,y <=30000 ; 0<V<1000
T, N, M, x, в - цели.

Выходные даны: (файл METEOR.SOL):
В единственную строку файла записать максимальное количество телескопов,
которые могут быть спрятанные к началу падения метеоритов.


Пример METEOR.DAT:
10
4
1 7 3 7 5 7 100 100
2
2 7 4 7
0.1

Пример METEOR.SOL:
2

Автор: AligatorV 6.12.2006, 00:30
Взрывное устройство, которое было заложено неизвестным террористом, имеет N - лампочек, и M - переключателей.
Каждый переключатель изменяет состояние некоторых лампочек на противоположный. Для обезвреживания бомбы, необходимо выключить все лампочки.
Напишите программу, которая спасет мир.

Входные данные: (файл BOMBA.DAT):
В первой строке число N. (0<N<=100)
Во второй строке содержится N чисел, которые помечают состояние каждой лампочки (0 - выключенная, 1 - включенная).
В третьей строке содержится число M. (0<M<=100)
В каждом из следующих M строк содержится число K (количество лампочек состояние которых изменяет данный переключатель) и K чисел - номера соответствующих лампочек.
Выходные даны: (файл BOMBA.SOL):
Если бомбу обезвредить невозможно, запишите в исходный файл "NO" (без кавычек).
Если возможно спасти мир, то в первую строку запишите "YES" (без кавычек), а во вторую строку запишите номера переключателей которые необходимо задействовать.
Пример BOMBA.DAT:
5
0 1 1 0 1
4
3 2 3 4
3 1 4 5
2 4 5
2 2 4

Автор: korob2001 6.12.2006, 02:44
Извиняюсь, я тут немного измеил условие, не в свою пользу. Только прозьба не обижаться, я не хочу никого обидеть, особенно автора этой задачи, очень интересная задача. Я лишь попытался усовершенствовать как условие, так и решение.

1. Отказался от данных первой и третьей строки, так как счёл их лишними. Насколько я понял, то первая строка содержит кол-во перключателей, что легко вычесляется программно таким образом:
Код

length(join("",split(/\s+/,$line)));

но и это не понадобилось, для решения данной задачи.

2. Если третий параметр - это общее кол-во вариантов разминирования, то это тоже не нужный параметр, так как код ниже пометит предложением  - YES, все варианты которые подошли для разминирования, не в зависимости от того, насколько много варинтов в файле, пусть даже 50GB и никогда не убъёт оперативную память, лишь бы хватило дискового пространства.

3. Что бы не уничтожать данные в файле, я решил сохранять результаты в отдельный файл, с таким же именем + окончание ".temp", т.е. "bomba.dat.temp". Если кому-то понадобится всёже перезаписывать исходный файл "bomba.dat", достаточно раскоментировать последние 2 строки.

Мой файл "bomba.dat" выглядет так:
Код

0 1 1 0 1
3 2 3 4
3 1 4 5
2 4 5
2 2 4
2 3 5
1 5 1 3 2

где первая строка - это переключатели бомбы, а все остальные (их может быть сколько угодно) - предлагаемые варианты разминирования.

Вот код:
Код

#!/usr/bin/perl
my $file = "./bomba.dat";
my(@bomb,@temp,$i) = ();

open my $fh, "<", "$file" or die "Can't open file '$file': $!\n";
open my $wh, ">", "$file.temp" or die "Can't open file '$file.temp': $!\n";
flock($wh,2);
@bomb=split(/\s+/,$_=<$fh>);
while (<$fh>) {
      chomp;
      @temp = @bomb;
      for my$p(split(/\s+/)){splice(@temp,$p-1,1,$temp[$p-1]?0:1)};
      $_.=(join('',@temp)+0)?" - NO":" - YES";
      print $wh "$_\n";
}
close($wh);
close($fh);
#unlink($file) or warn "Can't remove file '$file': $!\n";
#rename("$file.temp",$file) or warn "Can't rename file '$file.temp' to '$file': $!\n";

Здесь так же обрабатываются ошибки, потому код выглядит немного объёмным.

PS: На выходе у меня получился такой результат:
Код

3 2 3 4 - NO
3 1 4 5 - NO
2 4 5 - NO
2 2 4 - NO
2 3 5 - YES
1 5 1 3 2 - YES

Автор: Baltazar5000 6.12.2006, 20:02
!!!ПРОГРАММА НА C++!!!
Найти наименьший номер элемента последовательности, для которого выполняется условие b < E.
Вывести на экран этот номер и все элементы, где i=1,2,3,...n.
a(энное)=(a(энное)-1)/(n^2+1)
b=/a(энное)-a(энное-1)/
a(1)=5.1
E=10^-7
!!!!!Решить, используя циклы While или For или Do while или все вместе!!!!!
!!!ПРОГРАММА НА C++!!!
Срочно помогите написать.

Автор: ivashkanet 6.12.2006, 20:46
Baltazar5000, это задача неинтересная smile
Тебе в http://forum.vingrad.ru/index.php?showforum=142

Автор: Baltazar5000 6.12.2006, 21:37
Ну раз не интересная решите, please.

Автор: AligatorV 7.12.2006, 00:27
2 korob2001
А если не изменять условия?

Автор: korob2001 7.12.2006, 14:15
Цитата(AligatorV @  6.12.2006,  21:27 Найти цитируемый пост)
А если не изменять условия?

Тогда код получится менее гибкий. ;(((((
Код

#!/usr/bin/perl
open $fh,"<","bomba.dat" or die $!;
chomp(@info=<$fh>);
close($fh);
$info[1]=join("",(split(/\s+/,$info[1]))[0..$info[0]-1]);
for $nx (3..$info[2]+2) {
    $temp=$info[1];
    substr($temp,${_}-1,1)^=(substr($temp,${_}-1,1)+0) for $info[$nx]=~/(\d+)/g;
    push(@ok,$nx-2) unless ($temp+0);
}
open $fh,">","bomba.sol" or die $!;
flock($fh,2);
print $fh (@ok?"YES\n".join(",",@ok)."\n":"NO\n");
close($fh);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)