Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Составить программу формирования массива

Автор: unFair 18.04.2005 23:58

Даны натуральные числа К и N. Составить программу формирования массива А, элементами которого являются числа, сумма цифр которых ровна K и которые не больше N.

вот мой код

uses crt;
var
 a:array[1..20] of integer;
 k,n:byte;
 i,x:integer;
 procedure abc(i:integer);
begin
end;
begin
 clrscr;
 writeln('vvedite k: '); readln(k);
 writeln('vvedite n: '); readln(n);
 for i:=1 to 100 do
    if (i=k) and (i<=n) then a[i]:=i
    else if (((i mod 10)+(i div 10))=k) and (((i mod 10) or (i div 10))<n) then a[i]:=I;
 for i:=1 to 100 do
    write(a[i], ' '); readln;
    writeln;
end.

На экран вывводится примерно след:
Цитата
введите к: 5
введите n: 10
0 0 0 5 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 2565....
т.е., понятное дело, совершенно не то, что нужно
ПС: Задача на процедуру, но я её только описал, т.к. не знаю что она должна делать в задаче.

Автор: Altair 19.04.2005 0:31

Предлагаю алгоритм:

Function summz(n:integer):byte;
var result:byte;
begin
result:=0;
while n>0  do
begin
 inc(result,n mod 10);  n:=n div 10
end;
summz:=result;
end;

var
a:array[1..10] of integer;
i, ran, k,n:integer;
begin
randomize;
readln(k,n);
for i:=1 to 10 do
begin
 repeat
  ran:=random(n);
 until summz(ran)=k;
 a[ i ]:=ran;
end;
for i:=1 to 10 do write(a[ i ],' ');
end.


Обоснование:
При генерации чисел функция Random возвращает числа равномерно распределенные в интерале, следовательно за время T, мы получим знаение любое, если такое значениеможет существовать в необходимом интервале.

Автор: GoodWind 19.04.2005 0:38

Цитата
inc(result,n mod 10);  n:=n div 10;

красивое решение

Автор: Altair 19.04.2005 0:46

Я последнее время стал неравнодушен к интереным конструкциям smile.gif
А насчет процедуры - unFair, алгоримт я показал, в процедуру что тебе надо сам загонишь!