Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Число разложений без повторений ! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Помогите решать задачи http://www.cyberforum.ru/cpp-beginners/thread54011.html
Даны натуральные числа m и n. Найти такие числа m1 и n1, не имеющие общих делителей, что m1/n1=m/n. Числа m и n ввести с клавиатуры. Дано натуральное число n. Напечатать в порядке возрастания все...
C++ Напечатать каждое слово с новой строки Задача: написать программу, принимающую вводимый пользователем текст, и преобразовывающая его так, чтобы каждое слово печаталось на отдельной строчке. Условия: 1. Не мудрите. Не стройте... http://www.cyberforum.ru/cpp-beginners/thread54009.html
Указатели C++
Как правильно надо работать с указателями?? И для чего они служат??
Ошибка компилляции C++
Пожалуйста помогите!!!не могу найти ошибку при запуске пишет не найден ехе файл.
C++ Проблемма с кодом http://www.cyberforum.ru/cpp-beginners/thread53981.html
Помогите пожалуйста,если кто знает, нужно перевести этот код на С++. procedure OGI(R,S,M,N:integer;Var A:matrix); {R,S – разрешающий элемент} Var i,j:integer; begin for i:=1 to M do for...
C++ Что такое возврат каретки? \r - что делает этот управляющий символ, и чем он отличается от \n? подробнее

Показать сообщение отдельно
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
05.10.2009, 23:15
Вот вам базовый код
Суть: вводится число, допустим 10. Создаётся такой массив чисел
10, 9, 8, 7, 6, 5, 4, 3, 2, 1

Потом берутся все сочетания однушек (10, но не 9, это я предусмотрел)
Потом берутся все сочетания двушек из 10 (по-научному число сочетаний из n по m, как-то так), суммируются и проверяются на равенство 10.
То есть 10+ 9, 10+ 8, 10+ 7, 10+ 6... 9+ 8, 9+ 7 и так далее
Если находится такие числа- они заносятся в массив array. И этот массив выводится

Потом проверяются тройки, четвёрки, и так далее. Всё это делается в цикле, в основной функции
А поиск элементов в массиве и суммирование осуществляется в функции func_recurs.

При вводе числа 24 работа завершается ошибкой. То есть выведется простыня значений (верных, невповторяющихся, а потом прерывание)

В общем, можно код по многим направлениям усовершенстовать
1) Определиться с размером массива array (я наугад поделил число на 2 и всё)
2) Сделать так, чтобы при поиске двушек число 10 не было задействовано, ибо "10+ любое число" больше 10. А при поиске трёшек (третья итерация) чтобы не были задействовано соответсвенно, число 9 (может и 8, но это надо будет обосновывать)
3) Если вводишь число то же самое 25, допустим, а количество слагаемых задаёшь не в цикле, ну то есть просто вызываешь эту функцию один раз, допустим, так:
(То есть осуществляется поиск всех семёрок)

C++
1
func_recurs (0, 0, 7,25,7, massiv_chisel, array);
То работа проги заканчивается корректно. Да что там говорить, ребята, она корректо сработала так:
C++
1
func_recurs (0, 0, 6,100,6, massiv_chisel, array);
Неплохо, да? Умел бы прицеплять текстовые файлы прицепил бы, показал
Но не в цикле, а при отдельном вызове!
Вывод: cам по себе вызов функции жрёт немного памяти. А просто потому всё заканчивается ошибкой, что память остаётся занятой ПРЕДЫДУЩИМИ вызовами функций, которые уже даром не нужны. Вывели на экран значение- и всё.
Вот как-то научиться эту память освобождать.
Вот вам поле деятельности.
А я за сим удаляюсь.
Всегда ваш.
Кварам.


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
68
69
70
71
72
73
74
#include <iostream>
#include <stdio.h>
using namespace std;
 
//Вот это самое число
int osn_summa;
 
void func_recurs (int nomer_funktsii, int nomer_elementa, int kolichestvo_drugih_chisel, int kolichestvo_chisel, 
                  int kol_ostavshihsa_chisel,  int* stroka, int* array) {
 
static int summa= 0;
 
 
 for (int i= nomer_elementa; i< kolichestvo_chisel- kol_ostavshihsa_chisel+ 1; i++) {
 
  if (nomer_funktsii<kolichestvo_drugih_chisel- 1) {
   array [nomer_funktsii]= stroka [i];
   summa= summa+ stroka [i];
   
    func_recurs (nomer_funktsii+ 1, i+ 1,kolichestvo_drugih_chisel,kolichestvo_chisel, kol_ostavshihsa_chisel- 1, stroka, array);
 
   summa= summa- stroka [i];
  }
 
  else {
   summa= summa+ stroka [i];
   array [nomer_funktsii]= stroka [i];
   if (summa== osn_summa) {
    for (int j= 0; j< kolichestvo_drugih_chisel; j++) {
     printf ("%d   ", array [j] );
    }
    printf ("\n");
   }
   summa= summa- stroka [i];
   break;
  }
 }
}
 
 
 
int main () {
 
 
 
 
 cout<<"Вводите число"<<endl;
 cin>> osn_summa;
 
 //Сделаеv массивчик и заполним его
 int* massiv_chisel= new int [osn_summa];
 
 //Заполнение
 for (int i= 0; i< osn_summa; i++) {
  massiv_chisel [i]= osn_summa- i; 
 }
 
 //В этот массив будут заноситься числа-значения
 int array [osn_summa/2];
 
 //Вызов функции в цикле. Сперва с одним значением, потом со вторым и так далее
 for (int i= 1; i< osn_summa; i++) {
  func_recurs (0, 0, i,osn_summa, i, massiv_chisel, array);
 }
 
 //Закомментируйте предыдущий цикл, расскоментируйте этот вызов
 //Скомпилируйте, запустите и наслаждайтесь
 //func_recurs (0, 0, 6,100, 6, massiv_chisel, array);
 
 suda: system ("PAUSE");
 delete [] massiv_chisel;
 
 return 0;
}
Добавлено через 30 минут
Чтобы уж не быть голословным, вызывайте функции так прогу с такими параметрами
C++
1
2
3
4
5
6
7
  func_recurs (0, 0, 1, 100, 1, massiv_chisel, array);
  func_recurs (0, 0, 2, 100, 2, massiv_chisel, array);
  func_recurs (0, 0, 3, 100, 3, massiv_chisel, array);
  func_recurs (0, 0, 4, 100, 4, massiv_chisel, array);
  func_recurs (0, 0, 5, 100, 5, massiv_chisel, array);
  func_recurs (0, 0, 6, 100, 6, massiv_chisel, array);
  func_recurs (0, 0, 7, 100, 7, massiv_chisel, array);
И ждите. У меня всё нормально прошло, правда, машина долго работала но это из-за того, что вхолостую перебирает заведомо ненужные значения, я писал вначале.
А вот с восьмёркой запускать не советую.
Я окончания работы не дождался.
И ЕСЛИ ТАК БУДЕТЕ ЗАПУСКАТЬ ВВООДИТЕ ЧИСЛО 100. Или вообще закомментируйте ввод.
...А в цикле не хочет работать почему-то...
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru