1 Востаннє редагувалося RinaSatsu (12.10.2015 21:57:17)

Тема: Потрібна допомога!

Завдання:
Число N вводиться з клавіатури. Треба вивести всі числа, що задовольняють умову (2^a)*(3^b)*(5^c), де a, b і c >=0, та які менші за N.

N брала більше 0 і менше 100 (перший цикл).
Я робила його таким способом: спочатку формувала три масиви: перший (у програмі А) - числа-степені двійки; другий (В) - числа-степені трійки і третій (С) - числа-степені п'ятірки.
Тоді просто брала і поступово перемножувала кожен елемент кожного масиву з іншими (тобто, перший*перший*перший, перший*перший*другий і т. д.) і з них формувала четвертий масив (D). Звичайно, він не сортований, але це я виправлю пізніше.

Проблема в тому, що в масиві D невідомо звідки з'являються числа типу 14, 28, 44, 68. Я вирахувала, що вони з'являються кожен раз, коли цикл першого масиву (з іа) робить нове "коло". Я виправляла це за допомогою if, але це якось штучно і негарно. Я хочу зрозуміти, в чому помилка.
Ще одна проблема: у кінці значення починають повторюватись і я знову не розумію, чому.

Текст програми:
Program One;
uses crt;
var
   N, x, ia, ib, ic, id: integer;
   bool: boolean;
   A, B, C:array[1..8] of byte;
   D:array[1..106] of byte;
begin;
      ClrScr;
      bool:=false;
      x:=1;
      D[1]:=1;
      Write('Please, enter number less then 100: ');
      While (bool=false) do
      begin
           ReadLn(N);
           If ((N>0) and (N<=100))
           then bool:=true
           else Write('Wrong number. Please, enter another: ');
      end;
      ia:=1;
      While (x<100) do
      begin
            Write(x,' ');
            A[ia]:=x;
            х:=x*2;
            ia:=ia+1;
      end;
      x:=1;
      ib:=1;
      WriteLn;
      While (x<100) do
      begin
            Write(x,' ');
            B[ib]:=x;
            x:=x*3;
            ib:=ib+1;
      end;
      x:=1;
      ic:=1;
      WriteLn;
      While (x<100) do
      begin
            Write(x,' ');
            C[ic]:=x;
            x:=x*5;
            ic:=ic+1;
      end;
      id:=1;
      WriteLn;
      for ia:=1 to 7 do
          for ib:=1 to 5 do
              for ic:=1 to 3 do
              begin
                  D[id]:=A[ia]*B[ib]*C[ic];
                  if (D[id]<=N)
                  then
                  Write(D[id],' ');
                  id:=id+1;
              end;
      ReadKey;
end.

Будь ласка, не треба радити скористатися іншим методом (наприклад, перебору чи діленням). Мене цікавить саме цей.

2 Востаннє редагувалося koala (12.10.2015 22:09:09)

Re: Потрібна допомога!

Ви в курсі, скільки значень може зберігатися в одному байті?

D:array[1..100] of Longword;

гарантовано вирішить вашу проблему з "випадковими" числами.
І використовуйте теги [ code ].
Читання для загального розвитку.

Подякували: Torbins1

3

Re: Потрібна допомога!

RinaSatsu
Вітаю, ви щойно дізналися, що byte не резиновий. Це, до речі, стосується усіх типів.

4

Re: Потрібна допомога!

Дуже дякую, я зовсім забула про переповнення типу.