Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Массив, числа


Автор: nightlife 16.1.2010, 14:42
 Определить колво всех 7мизначн чисел,сумма цифр которого равна 60. Поместить эти числа в массив в порядке убываниЯ

Автор: Sanaff 16.1.2010, 15:31
Могу сделать задачку, обращайтесь на почту shuv_aa@mail.ru или  ICQ 373-628-456

Автор: ClrScr 31.1.2010, 16:05
Код

uses crt;
var a:array[1..1000] of integer;
    s:string;
    i,x,k,f,sum,n:integer;
begin
k:=1;
for f:=9999999 downto 1000000 do
begin
sum:=0;
str(f,s);
for i:=1 to length(s) do
begin
case ord(s[i]) of
48: x:=0;
49: x:=1;
50: x:=2;
51: x:=3;
52: x:=4;
53: x:=5;
54: x:=6;
55: x:=7;
56: x:=8;
57: x:=9;
end;
sum:=sum+x;
end;
if sum=60
then
begin
a[k]:=f;
inc(k);
inc(n);
end;
end;
for i:=1 to n do
write(a[i],' ');
end.

Автор: t_gran 1.2.2010, 03:35
ClrScr, Вы бы ещё в одну строчку написали! Учитесь форматировать код прежде чем помогать.

Автор: ClrScr 4.2.2010, 22:01
Извините, пожалуйста, но в таких маленьких и простых программах больше важен результат, чем читабельность, поэтому...

P.S. Кстати, программа у всех корректно работает???

Автор: volvo877 5.2.2010, 12:47
Цитата(ClrScr @  4.2.2010,  21:01 Найти цитируемый пост)
Кстати, программа у всех корректно работает??? 
Нет, конечно... Это и без компиляции видно. Диапазон допустимых значений для типа Integer - от -32768 до +32767 (в Турбо-Паскале, к примеру), а ты миллионами ворочаешь. Хотя да, 
Цитата(ClrScr @  4.2.2010,  21:01 Найти цитируемый пост)
в таких маленьких и простых программах больше важен результат
, фиг бы с ним, что неправильный, кого это вообще интересует?

К тому же, ко тебе дал право увеличивать значение n? Ты его инициализировал, чтоб с им работать? На предупреждения компилятора - тоже не смотрим? Надеемся на то, что автоматически туда занесется 0? Напрасно. Гораздо спокойнее проинициализировать самому, и не волноваться потом...


Автор: ФедосеевПавел 5.2.2010, 17:44
Можно, и я парочку вариантов подкину?
Первый, компилируется и в TP и в FPC
Код

PROGRAM Pas_022a;
CONST
  N     = 7;    {количество разрядов в проверяемом числе}
  EtSum = 60;   {эталонная сумма цифр}
TYPE
  {тип для определения числа. Один элемент массива - одна цифра числа.
   Элемент с индексом [1] - младший, с индексом [N] - старший.}
  TArray = array [1..N] of Integer;

{инкремент числа типа TArray}
PROCEDURE IncTArray(VAR x : TArray);
VAR
  i   : Integer;
  CY  : Integer;  {признак переноса в старший разряд}
BEGIN
  CY:=1;
  for i:=1 to N do begin
    x[i]:=x[i]+CY;
    if x[i]>9
      then x[i]:=x[i]-10
      else CY:=0;
    if CY=0 then Break;
  end;
END;

{вывод на экран числа типа TArray}
PROCEDURE ShowTArray(VAR x : TArray);
VAR
  i   : Integer;
BEGIN
  for i:=N downto 1 do
    if x[i]<>0
      then Write(x[i])
      else Write(' ');
  Write(' ');
END;

{вычисление суммы цифр числа типа TArray}
FUNCTION  SumTArray(VAR x : TArray) : Integer;
VAR
  i   : Integer;
  Sum : Integer;  {сумма цифр числа x}
BEGIN
  Sum:=0;
  for i:=1 to N do Sum:=Sum+x[i];
  SumTArray:=Sum;
END;

{проверка на максимально возможное значение числа типа TArray}
FUNCTION  IsMaxTArray(VAR x : TArray) : BOOLEAN;
BEGIN
  IsMaxTArray:=(SumTArray(x)=9*N);
END;

VAR
  x     : TArray;   {одно из искомых чисел}
  Count : Integer;  {количество чисел, удовлетворяющих условию Sum(x[i])=EtSum}
  i   : Integer;
BEGIN

  Count:=0;

         {7654321}  {7654321}
  {for x:=1000000 to 9999999 do}
  {x:=1000000}
  x[N]:=1;
  for i:=(N-1) downto 1 do x[i]:=0;

  repeat
    if SumTArray(x)=EtSum
    then begin
      Inc(Count);
      ShowTArray(x);
    end;
    if IsMaxTArray(x) then Break;
    IncTArray(x);
  until FALSE;
  WriteLn;
  WriteLn(Count);
END.

Второй, компилируется только в TP, а FPC сильно не согласен с таким подходом 
Код

PROGRAM Pas_022b;
CONST
  N     = 7;    {количество разрядов в проверяемом числе}
  EtSum = 60;   {эталонная сумма цифр}
TYPE
  {тип для определения числа. Один элемент массива - одна цифра числа.
   Элемент с индексом [1] - младший, с индексом [N] - старший.}
  TArray = array [1..N] of Integer;

{вывод на экран числа типа TArray}
PROCEDURE ShowTArray(VAR x : TArray);
VAR
  i   : Integer;
BEGIN
  for i:=N downto 1 do
    if x[i]<>0
      then Write(x[i])
      else Write(' ');
  Write(' ');
END;

VAR
  x     : TArray;   {одно из искомых чисел}
  Sum   : Integer;  {сумма цифр числа x}
  Count : Integer;  {количество чисел, удовлетворяющих условию Sum(x[i])=EtSum}
  i     : Integer;
BEGIN

  Count:=0;
  for x[7]:=1 to 9 do begin
    for x[6]:=0 to 9 do begin
      for x[5]:=0 to 9 do begin
        for x[4]:=0 to 9 do begin
          for x[3]:=0 to 9 do begin
            for x[2]:=0 to 9 do begin
              for x[1]:=0 to 9 do begin
                Sum:=0;
                for i:=1 to N do Sum:=Sum+x[i];
                if Sum=EtSum
                then begin
                  Inc(Count);
                  ShowTArray(x);
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
  WriteLn;
  WriteLn(Count);
END.

Автор: volvo877 6.2.2010, 17:56
Цитата(ФедосеевПавел @  5.2.2010,  16:44 Найти цитируемый пост)
Второй, компилируется только в TP, а FPC сильно не согласен с таким подходом 
Во-первых, его можно попросить согласиться ({$mode TP}, хотя делать этого действительно не стОит, тут FPC полностью прав, а Борланд не выполняет того ,что написано в его же документации:
Цитата
В качестве управляющей переменной должен использоваться идентификатор переменой (без какого-либо  квалификатора), который обозначает переменную, объявленную локальной в блоке, в котором содержится оператор for.
, http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr7.shtml#14)

А во-вторых, вот это:
Код
var
  k, curr, value: longint;
  sums: array[1 .. 7] of integer;
  i1, i2, i3, i4, i5, i6, i7: integer;

begin
  k := 0;
  for i1 := 9 downto 1 do begin
    sums[1] := i1;
    for i2 := 9 downto 0 do begin
      sums[2] := sums[1] + i2;
      for i3 := 9 downto 0 do begin
        sums[3] := sums[2] + i3;
        for i4 := 9 downto 0 do begin
          sums[4] := sums[3] + i4;
          for i5 := 9 downto 0 do begin
            sums[5] := sums[4] + i5;
            for i6 := 9 downto 0 do begin
              sums[6] := sums[5] + i6;
              for i7 := 9 downto 0 do begin
                sums[7] := sums[6] + i7;
                if sums[7] = 60 then begin
                  inc(k);
                  write(i1, i2, i3, i4, i5, i6, i7, ' ');
                end;
              end
            end
          end
        end
      end
    end
  end;
  writeln(k);
end.
у меня работает в среднем в 3 раза быстрее, чем твой код (FPC 2.4)

Автор: ФедосеевПавел 8.2.2010, 00:35
Ой, точно...
Цитата(nightlife @  16.1.2010,  15:42 Найти цитируемый пост)
Поместить эти числа в массив в порядке убываниЯ


Надо же. Сокращение вычисления суммы цифр как значительно влияет на скорость (второй выриант с mode TP, конечно, не в три раза, но всё равно заметно медленнее).

Спасибо! ;)

Ещё раз посмотрел. Именно второй вариант раза в три медленнее, а про первый лучше совсем забуду.

Спасибо! Красивая идея!

Автор: doda 9.3.2010, 13:03
ввести с клавиатуры предложение из нескольких слов. упорядочить буквы в каждом слове методом "просеивания" по алфавиту

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)