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

Разложение на слагаемые - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
XemyL
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 14
16.09.2011, 10:19     Разложение на слагаемые #1
На входе у нас число (нат, пол) которое нужно разложить и ожидаймое количество слагаймых
алгоритм решения таков..выделяем место для одномерного массива, заполняем его 1-ми
увеличиваем последний елемент, пока сумма всех елементов не достигнет значения числа, которое мы разлогаем..выводим, уменшаем последний елемент на 1, при етом увеличивае предпоследний на 1 и т.д., но что бы выполнялись условия - следующий елемент (слагаймое) был не менше предущего и не больше остатка от разницы между суммой и предущим елементом. вывод тогда, когда остаток равный 0.
Нужно сделать программу БЕЗ рекурсии, но что то не доходит до меня как правильно наложить условия, в данном виде прога определяет только два слагаймые, при большем количестве идет зацыкливантие, помогите плс)


Не по теме:


Ето то, что смог делать на паскале, но и сишный вариант подойдет

Pascal
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
program RSlag;
uses crt;
var
   q: word;
   n: word;
   p, i: word;
   arr: array[1..1000] of word;
 
function Summ: boolean;
var
   i, sum: word;
begin
   sum := 0;
   for i := 1 to q do
   begin
      sum := sum + arr[i];
   end;
   if sum = n then Summ := true
   else Summ := false;
end;
 
procedure Printf;
var
   i: word;
begin
   for i := 1 to q do
      write(arr[i], ' ');
   writeln;
   readln;
end;
 
begin
   writeln('n: ');
   readln(n);
   writeln('q: ');
   readln(q);
   for i := 1 to q do
      arr[i] := 1;
   
   i:=1;
    if Summ <> true then
      repeat
         inc(arr[q])
      until Summ = true;
   printf;
   p := q;
   while Summ = true do
    begin
     if p <= i then 
      begin
      dec(p);
      inc(i);
      end;
     
      while (arr[p] >= arr[p - 1]) and (arr[p] <= (n - arr[p - 1])) do
       begin
        Printf;
        dec(arr[p]);
        inc(arr[p - i]);  
       end;
      if (arr[p] = arr[p - 1]) and (arr[p] = (n - arr[p - 1])) then
       begin
       dec(p);
       inc(i);
       end;
 
    end;
 
end.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zalogic
 Аватар для zalogic
144 / 140 / 2
Регистрация: 12.12.2010
Сообщений: 253
16.09.2011, 10:52     Разложение на слагаемые #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
#include <iostream>
using namespace std;
  int q,n,p,i;
  int arr[1000];
 
 
bool Summ()
{
   int sum;
   sum = 0;
   for (int i= 1; i<q; i++)  sum = sum + arr[i];
   if (sum==n) return true;
   else return false;
}
 
 
void Printf(){
   int ir;
   for (int i= 1; i<q; i++) cout<<arr[i]<<" ";
   cout<<"\n";
   cin>>ir;
}
 
int main(){
   cout<<"n: "<<"\n";
   cin>>n;
   cout<<"q: "<<"\n";
   cin>>q;
   for (i= 1; i<q; i++) arr[i] = 1;
   i=1;
    if (Summ()!= true) 
      do{
         arr[q]++;
         }
      while (Summ() == true);
   Printf();
   p = q;
   while (Summ()== true){
     if (p <= i) {p--;i++;}        
      while ((arr[p] >= arr[p - 1]) && (arr[p] <= (n - arr[p - 1]))) {
        Printf();
        arr[p]--;
        arr[p - i]++;  
       }
      if ((arr[p] == arr[p - 1]) && (arr[p] == (n - arr[p - 1]))){p--;i++;}
    }
 return 0;
}
как-то так наверно...
XemyL
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 14
16.09.2011, 21:26  [ТС]     Разложение на слагаемые #3
как я понял ето то что я написал только на с++, но мой код видь не работает, поетому я спросил как сделать
rostykm
2 / 2 / 0
Регистрация: 30.03.2011
Сообщений: 34
16.09.2011, 21:31     Разложение на слагаемые #4
Цитата Сообщение от XemyL Посмотреть сообщение
как я понял ето то что я написал только на с++, но мой код видь не работает, поетому я спросил как сделать
ничего не понял
XemyL
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 14
16.09.2011, 23:47  [ТС]     Разложение на слагаемые #5
мой пример переписан на языке с++, которые не рабочий, мне же нужно рабочий
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
17.09.2011, 05:45     Разложение на слагаемые #6
Цитата Сообщение от XemyL Посмотреть сообщение
мой пример переписан на языке с++, которые не рабочий, мне же нужно рабочий
нет, это жуткий суржик паскаля и си
в сях конструкция "begin end" заменяется скобками "{}", конструкция "if условие then" пишется просто так "if (условие)", оператор "=" по умолчанию оператор присваивания, для сравнения используется оператор "==" да, блин, тут писать и писать. твой пример никакого отношения к си или с++ не имеет. смотри пост №2
Yandex
Объявления
17.09.2011, 05:45     Разложение на слагаемые
Ответ Создать тему
Опции темы

Текущее время: 17:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru