![]() |
|
#1
|
|||
|
|||
![]() добрый вечер. Такой вопрос, почему он умножает только на 0 в моей последовательности, ведь должна либо 0 либо 1 подставлять
Даны натуральные числа а1,…,а5.Предположим,что имеются 5 гирь весом а1,…,а5.Обозначим через Cк число способов,которыми можно составить вес л,то есть Cк-число решений уравнения а1Х1+…+а5Х5=к, где Хi может принимать значение 0 и 1(i= 1,…,5).Получить С0,…,С5. Код:
program Project12; {$APPTYPE CONSOLE} uses SysUtils; var C:array of integer; Type IndexType = 1..5; Mas = array [IndexType] of integer; var dim:1..5; a:Mas; N,i,v,g,j,l,t,r,sum,m, k: integer; begin try sum:=0; j:=0; begin repeat writeln('vvodim sami (1) ili random (2) ?'); readln(N) until (N<>1) or (N<>2); if N=1 then for i:= 1 to 5 do begin write(' vvedite A[ ' , i , ' ] = ' ); readln(a[i]) end else begin randomize; for i:= 1 to 5 do a[i]:= - 0 + Random(71); end; writeln; writeln('otv a'); m:=0; for i:=low(IndexType) to high(IndexType) do begin write(a[i]:5,' '); m :=m+a[i]; end; writeln; end; SetLength(C,m); write(' vvedite k ' ); readln(k); C[i]:=0; for i:=0 to k do for v := 0 to 1 do for g := 0 to 1 do for l := 0 to 1 do for t := 0 to 1 do for r := 0 to 1 do while C[sum] <> k do begin sum:=a[1]*v+a[2]*g+a[3]*l+a[4]*t+a[5]*r; C[sum] := C[sum] + 1; if sum=k then writeln (' posledovatelnost ',a[1], ' *' , v , '+ ',a[2],' * ', g ,'+ ',a[3], ' * ', l ,'+ ',a[4], ' * ', t ,'+ ',a[5], ' * ',r,' = ',sum) end; writeln (' kol-vo predstavlenii '); for i := 0 to 5 do writeln ('ves ',k,' mojem poluchit sum sposobom ',sum ); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; readln; end. Последний раз редактировалось Admin, 12.10.2014 в 19:32. |
#2
|
||||
|
||||
![]() Давайте систему циклов
Код:
for i:=0 to k do for v := 0 to 1 do for g := 0 to 1 do for l := 0 to 1 do for t := 0 to 1 do for r := 0 to 1 do while C[sum] <> k do begin sum:=a[1]*v+a[2]*g+a[3]*l+a[4]*t+a[5]*r; C[sum] := C[sum] + 1; if sum=k then writeln (...) end; Что происходит? 1) При первом выполнии цикла While (i=v=g=l=r=t=0) sum=0. Благодаря оператору C[sum] := C[sum] + 1; значение в C[sum] становится равным k, другими словами, С[0]=k, sum=0. 2) Происходит выход из While и запускается новая итерация циклов for, при которой r=1, а все остальные счетчики по прежнему 0. При этом в sum по прежнему 0, а c[sum]=k. В следствии этого, цикл While не выполняется, потому что условие его выполнения ложно. То же происходит для всех последующих итераций, что и создает у вас ощущение, что i, v,g,l,r,t всегда 0. Понятнее стало? Я бы посоветовал что-то поправить, но, если честно, вообще не понял зачем вам while Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров |