Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2009, 13:22   #1
Evgo
Пользователь
 
Регистрация: 17.06.2009
Сообщений: 17
Восклицание Помогите решить задачу на циклы на Паскале.

Напечатать все различные разбиения числа N на три натуральных слагаемых.
Evgo вне форума Ответить с цитированием
Старый 19.06.2009, 21:40   #2
Evgo
Пользователь
 
Регистрация: 17.06.2009
Сообщений: 17
По умолчанию

Недоработанная программа выглядит так:
Program zadacha3_4;
uses crt;
Var
N,a,b,c,i:integer;
Begin
clrscr;
Writeln('Vvedite chislo N');
Readln(N);
a:=0; b:=0; c:=0;
repeat
for a:=1 to n-2 do
for b:=1 to n-a-1 do
if c=n-a-b then
writeln('Variant razbieniya:',a,',',b,',',c,' ')
else c:=c+1;
until a+b+c=n;
Readln;
end.
Помогите доработатьб чтоб программа выдавала все варианты разбиения.
Evgo вне форума Ответить с цитированием
Старый 19.06.2009, 21:50   #3
NSvirus
пропагандирую жизЪ
Форумчанин
 
Аватар для NSvirus
 
Регистрация: 19.03.2007
Сообщений: 950
По умолчанию

Ты знаешь что чем больше число ты введешь, тем больше случаев будет?
Если тебе нужны все варианты, то такая программа при значении 20 скорее всего будет занимать весь экран...
Посторонним В.
NSvirus вне форума Ответить с цитированием
Старый 19.06.2009, 21:55   #4
Evgo
Пользователь
 
Регистрация: 17.06.2009
Сообщений: 17
По умолчанию

При значении 8 она выдает меньше вариантов, чем должна. Помогите найти ошибку в программе.
Evgo вне форума Ответить с цитированием
Старый 19.06.2009, 22:11   #5
NSvirus
пропагандирую жизЪ
Форумчанин
 
Аватар для NSvirus
 
Регистрация: 19.03.2007
Сообщений: 950
По умолчанию

кажется так:
Код:
uses crt;
 var
 N,a,b,c:integer;
 begin
  clrscr;
  readln(N);
  for a:=1 to n-2 do
   for b:=1 to n-a-1 do
    begin
     c:=n-a-b;
    writeln('Variant:',a,',',b,',',c);
    end;
    readln;
 end.
Посторонним В.

Последний раз редактировалось NSvirus; 19.06.2009 в 22:16.
NSvirus вне форума Ответить с цитированием
Старый 19.06.2009, 22:12   #6
NSvirus
пропагандирую жизЪ
Форумчанин
 
Аватар для NSvirus
 
Регистрация: 19.03.2007
Сообщений: 950
По умолчанию

только здесь ноль не учитывается, если нужен-сделай сам
Посторонним В.
NSvirus вне форума Ответить с цитированием
Старый 19.06.2009, 22:23   #7
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от NSvirus Посмотреть сообщение
Ты знаешь что чем больше число ты введешь, тем больше случаев будет?
Если тебе нужны все варианты, то такая программа при значении 20 скорее всего будет занимать весь экран...
если рассматривать кол-во разбиений, в таком случае оно будет 2^19... однако если внимательно прочитать условие, можно заметить что кол-во слагаемых ограничено 3...

На самом деле для 20 будет всего лишь 9 разбиений.. с учетом того, что разбиения (10,4,6) и (6,10,4) к примеру равнозначны...

программа:
Код:
var
	i,num,a,b,c:byte;
begin
	a := 1; b := 0; c := 0;
	readln(num);
	repeat
		for i:=1 to a do begin
			inc(b);
			b := 1;
			c := num - a - b;
		end;
		writeln(a,' ',b,' ',c);
		inc(a);
	until a > num div 2;
	readln;
end.
для четных чисел целесообразно сделать num div 2 - 1... а лучше добавить проверку на четность и исходя из этого вычислять предел.. или так
Код:
	until a > num div 2 - (1 - num mod 2);
Uguu~

Последний раз редактировалось __STDC__; 19.06.2009 в 22:27.
__STDC__ вне форума Ответить с цитированием
Старый 19.06.2009, 22:25   #8
NSvirus
пропагандирую жизЪ
Форумчанин
 
Аватар для NSvirus
 
Регистрация: 19.03.2007
Сообщений: 950
По умолчанию

Цитата:
На самом деле для 20 будет всего лишь 9 разбиений.. с учетом того, что разбиения (10,4,6) и (6,10,4) к примеру равнозначны...
он просил все варианты, вот они предоставлены.
Разве не так?
------------------добавлено---------
Туплю, хотя судя по его коду так и нужно делать..,
Посторонним В.

Последний раз редактировалось NSvirus; 19.06.2009 в 22:30.
NSvirus вне форума Ответить с цитированием
Старый 19.06.2009, 22:29   #9
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от NSvirus Посмотреть сообщение
он просил все варианты, вот они предоставлены.
Разве не так?
нет...

Цитата:
Разбие́ние числа́ n — это представление n в виде суммы положительных целых чисел, называемых частями. При этом порядок следования частей не учитывается (в отличие от композиций), то есть разбиения, отличающиеся только порядком частей, считаются равными.
(с) Википедия.
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 19.06.2009, 22:53   #10
Evgo
Пользователь
 
Регистрация: 17.06.2009
Сообщений: 17
По умолчанию

Этот код выводит ошибку.
Evgo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачу в Паскале? ТолянPAVL Помощь студентам 3 15.06.2009 19:27
Помогите решить задачу в паскале P@niSheR Помощь студентам 2 08.12.2008 18:48
Помогите решить задачу в ПАСКАЛЕ triston Помощь студентам 3 17.11.2008 17:46