Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Олимпиады

Страница: 1 |

 

  Вопрос: Олимпиадная задача. Помогите... Добавлено: 05.01.04 12:07  

Автор вопроса:  MACROS
Плиз, помогите решить вот эту задачу (олимпиадная), а то у меня что-то не выходит.
 
Написать рекурсивную программу преставления натурального числа N (0<N<=8) суммой натуральных чисел. Перестановка слагаемых нового варианта не дает.

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 05.01.04 23:12

Если идею решения, то ход примерно такой:

Считать от максимального числа до 1

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

Глобальный массив для сохранения результатов

Вызов: функция(число, максимальное число)

Самому писать неохота, но если не сможешь реализовать, попробую.

Ответить

Номер ответа: 2
Автор ответа:
 MACROS



Вопросов: 24
Ответов: 21
 Профиль | | #2 Добавлено: 06.01.04 12:05

Sharp, плиз, реши. А то ее даже мой учитель по информатике решить не смог, и у меня не получается.

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 06.01.04 16:11

Во, блин, не умнчал бы я, не пришлось бы над задачей сидеть... :)))

Хотя не так-то долго она и сопротивлялась минут 10, дольше над глюками сидел :). Вот результат моих потуг (переведешь?):

#include

long a[8];

long retsum(long n,long m,long l){

long i;

if(n>0){

for(i=((n>m)?m:n);i>0;i--){

a[l]=i;

retsum(n-i,i,l+1);

}

}

else{

for(i=0;i

cout<

}

cout<<"\n";

}

}

void main(){

retsum(8,8,0);

cout<<"\n\n";

}

Ответить

Номер ответа: 4
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 06.01.04 16:27

В #include было написано <iostream.h>

Понятно, что вызывать ее стоит retsum(n,n,0), а не только 8,8,0

Помню когда-то в незапамятные времена на форуме проскользнула фраза: "Блин, начинаю хххх уподобляться, сперва пишу нерабочий код, а потом выпускаю к нему патчи" :D

А про препода не удивляйся - разве это их основная работа - олимпиадные задачи решать? Моя учительница все время меня на уроке втихаря спрашивала, правильно ли она операторы написала :)))

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 06.01.04 16:54

Он снова не заметил глюка

И продолжал постить, постить...

Двустишие © Sharp

#include <iostream.h>

long a[8];

long retsum(long n,long m,long l){

long i;

if(n>0){

for(i=((n>m)?m:n);i>0;i--){

a[l]=i;

retsum(n-i,i,l+1);

}

}

else{

for(i=0;i<l;i++){

cout<<a[i];

}

cout<<"\n";

}

}

void main(){

retsum(8,8,0);

cout<<"\n\n";

}

Патчи выходят каждые 10 минут ;)

Админам - сделайте наконец-то тег специально для нас!

Ответить

Номер ответа: 6
Автор ответа:
 MACROS



Вопросов: 24
Ответов: 21
 Профиль | | #6 Добавлено: 07.01.04 17:15

Че то ничё не понятно, на каком это языке? PHP?

Напиши для QBasic или VB6, если не получается написать из-за того, что форум вырезает теги, отошли мне на мыло virus6000@yandex.ru

Ответить

Номер ответа: 7
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 07.01.04 17:25

В последней версии он ничего не вырезает. Это не PHP, это C++ :) На VB перевести можно, но лениво (ну поуговаривай меня, ну поуговаривай :) )

Ответить

Номер ответа: 8
Автор ответа:
 MACROS



Вопросов: 24
Ответов: 21
 Профиль | | #8 Добавлено: 08.01.04 08:22

Ну плиз, плиз, плиз...

Сколько еще уговаривать?

Да, кстати почему ты написал код на C++, ведь форум посвящен VB? Короче, напиши пожалуйста на VB или лучше на QBasic.

Ответить

Номер ответа: 9
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #9
Добавлено: 08.01.04 09:39

Алгоритмы почит всегда пишут на Си. А вообще же это форум по ПРОГРАММИРОВАНИЮ на Visual Basic. Но я добрый :) :

Dim a(100)

Private Sub Command1_Click()
n = Val(InputBox("Введите число"))
RetSum n, n, 0
End Sub

Private Sub RetSum(n, m, l)

If n > 0 Then
For i = IIf(n > m, m, n) To 1 Step -1
a(l) = i
RetSum n - i, i, l + 1

Next
Else
For i = 0 To l - 1
res = res & CStr(a(i)) & " "
Next
List1.AddItem res
res = ""
End If
End Sub

Ответить

Номер ответа: 10
Автор ответа:
 MACROS



Вопросов: 24
Ответов: 21
 Профиль | | #10 Добавлено: 08.01.04 19:04

Ты гений, работает. Спасибко! :)

Был бы презнателен, если бы ты еще объяснил что делает и что значит функции "IIf" и "CStr". Или вообще пояснил каждую строчку для понятия. Ну если нет, так нет. Я и так тебе благодарен. :)

Ответить

Номер ответа: 11
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #11
Добавлено: 08.01.04 19:25

Iif - аналог тринарного оператора в C. Синтаксис: Iif(cond,expr1,expr2) - возвращает expr1, если cond=TRUE, и expr2, если FALSE. CStr - конвертирует число в строку. Как решается:

Так как нужны все суммы, надо рекурсивно вычитать и числа последовательно все числа от N до 1 до тех пор, пока не станет равно 0. Так же для каждой разности. В a() сохраняются слагаемые, в l - уровень вложения рекурсии и, соответственно, число слагаемых. Так как повторы не нужны, результат должен быть отсортирован, для этого сделаем так, чтобы из числа нельзя было вычесть большее число, чем вычиталось на предыдущем шаге рекурсии - передаем прошлое число. Как видим, для вычитания перебираются все числа от минимального из n и m - это делается для того, чтобы не вычесть из n число, большее его самого, но и не большее m, до 1. Вот так все и работает. Вообще же это быстроразветвляющаяся рекурсия, поэтому при росте N ресурсоемкость будет сильно возрастать. Можно рассчитать верхнюю оценку этого числа - предположим, что все слагаемые - единицы, тогда потребуется N вложений, каждое из которых будет содержать где-то N разветвлений. Итого N^N... Но это, имхо, уж очень пессимистичная оценка. Хотя для 8 - в пределах разумного :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам