53f6 Паскаль. Ответы. P.58. Реализация алгоритмов. Задачи Дьюдени. Сборник задач по программированию Александра Приходько
 

Сборник задач по программированию. Старая версия

 

 Приходько А. Н.

 

pascal, учебный материал, ответы, обучение, объект, примеры, программа, xml, задачи, образование
 

Паскаль. Ответы. P.58. Реализация алгоритмов. Задачи Дьюдени



главная страница
P.58.2.

Первая попытка - напишем программу в предположении, что искомое число состоит не более, чем из 9-ти цифр, то есть, помещается в диапазон Longint.

Program E_5_2_2;
uses crt, dos;
label kkk;
var
    S : array[1..9] of 0..2;
    Per : 0..1;
    Pr, Prr : boolean;
    i : integer;
    LL : longint;
    MM : integer;
    Len, Num3, Num7 : integer;
begin
    Pr:=false;
    Prr:=false;

    for Len:=1 to 9 do begin

        for i:=1 to 9 do S[i]:=0;

        repeat
            Prr:=true;
            for i:=1 to Len do Prr:=Prr and (S[i]=1);

            LL:=0;    MM:=0;    Num3:=0;    Num7:=0;
            for i:=1 to Len do begin
                LL:=LL*10;
                if S[i]=0 then begin
                    LL:=LL+3;
                    MM:=MM+3;
                    Num3:=Num3+1
                end
                else begin
                    LL:=LL+7;
                    MM:=MM+7;
                    Num7:=Num7+1
                end;
            end;
            Pr:=(LL mod 3=0) and (LL mod 7=0) and
            (MM mod 3=0) and (MM mod 7=0) and
            (Num3>0) and (Num7>0);

            Per:=1;
            for i:=1 to Len do begin
                S[i]:=S[i]+Per;    Per:=0;
                if S[i]=2 then begin
                    Per:=1;    S[i]:=0;
                end;
            end;

        until Pr or Prr;

        if Pr then goto kkk;

    end;

    LL:=0;

kkk:
    writeln(LL);
end.

Данная программа не нашла требуемое число. Следовательно, данное число состоит более, чем из 9-ти цифр. Перепишем эту программу с использованием символьной арифметики, в предположении, что искомое число состоит не более, чем из 250-ти цифр. Символьная арифметика описана в решении задачи P.36.1.

Program E_5_2_2A;
uses crt, dos, LargeNumbers;
label kkk;
var
    S : array[1..250] of 0..2;
    Per : 0..1;
    Pr, Prr : boolean;
    i : integer;
    LL, X3, X7, X10, XA, XB, XC, XD : string;
    MM : integer;
    Len, Num3, Num7 : integer;
begin
    Pr:=false;
    Prr:=false;

    X3:=LNAssign(3);
    X7:=LNAssign(7);
    X10:=LNAssign(10);

    for Len:=1 to 250 do begin

        for i:=1 to 250 do S[i]:=0;

        repeat
            Prr:=true;
            for i:=1 to Len do Prr:=Prr and (S[i]=1);

            LL:=LNAssign(0);
            MM:=0;    Num3:=0;    Num7:=0;

            for i:=1 to Len do begin
                LL:=LNMul(LL,X10);
                if S[i]=0 then begin
                    LL:=LNAdd(LL,X3);
                    MM:=MM+3;
                    Num3:=Num3+1
                end
                else begin
                    LL:=LNAdd(LL,X7);
                    MM:=MM+7;
                    Num7:=Num7+1
                end;
            end;
            LNDivMod(LL,X3,XA,XB);
            LNDivMod(LL,X7,XC,XD);
            Pr:=LNAskZero(XB) and LNAskZero(XD) and
            (MM mod 3=0) and (MM mod 7=0) and
            (Num3>0) and (Num7>0);

            Per:=1;
            for i:=1 to Len do begin
                S[i]:=S[i]+Per;    Per:=0;
                if S[i]=2 then begin
                    Per:=1; S[i]:=0;
                end;
            end;

        until Pr or Prr;

        if Pr then goto kkk;

    end;

    LL:=LNAssign(0);

kkk:
    writeln(LL);
end.

Данная программа нашла требуемое число. Это число есть 7337733333.

P.58.3.

Поскольку в языке Паскаль нет типов чисел, содержащих большое число цифр, то напишем требуемую программу с использованием символьной арифметики.. Символьная арифметика описана в решении задачи P.36.1. Заметим, что эта программа реализует чисто переборный алгоритм и будет выполняться на компьютере с процессором Pentium несколько часов.

Program E_5_2_3;
uses crt, dos, LargeNumbers;
var
    X10, AA, BB, CC, XX000, R1, R2, XX : string;
    Pr : boolean;
    sh : integer;
begin
    X10:=LNAssign(10);
    AA:=LNAssign(123456789);
    BB:=LNAssign(100000009);
    XX:=LNAssign(987654321);
    XX000:=LNAssign(1000000000);

    sh:=0;
    repeat
        sh:=sh+1;
        CC:=LNMul(AA,BB);
        LNDivMod(CC,XX000,R1,R2);
        Pr:=(R2=XX);
        if not Pr then BB:=LNAdd(BB,X10);
        if sh>999 then begin
            sh:=0;
            writeln(BB);
        end;
    until Pr or (length(BB)>9);

    if not Pr then BB:=LNAssign(0);

    writeln('================');
    writeln('================');
    writeln('================');
    writeln(BB);
    writeln('================');
end.

 

©   Александр Приходько    1996 - 2006

69 0