четверг, 15 августа 2013 г.

29. Уровень палиндромности

prb29Задано натуральное М. Если число не палиндром – записываем его в обратном порядка и слагаем с заданным. Действия повторяем до тех пор, пока не получим число-палиндром. Количество выполненных операций назовем уровнем палиндромности заданного числа.
   Найти уровень палиндромности заданного числа М.
Код решения:
*****
type mas=array[0..1000] of integer;
VAR i, mm, count, m, temp:longint;
   s:string;
   sm, old, new, mt:mas;
function check (st:mas):boolean;
var t, j:longint;
   flag:boolean;
begin
    t:=st[0];
    flag:=true;
    j:=1;
    while flag and (j<=t div 2) do
    begin
        if st[j]<>st[t-j+1] then flag:=false;
        inc(j);
    end;
    check:=flag;
end;
procedure perev(a:mas; var per:mas);
var t, tt:integer;
begin
    for t:=1 to a[0] div 2 do
    begin
         tt:=a[t];
         a[t]:=a[a[0]-t+1];
         a[a[0]-t+1]:=tt;
    end;
    per:=a;
end;
procedure dig_to_str(h:longint; var st:mas);
var i:integer;
   ch:char;
   stemp:string;
begin
    str(h, stemp);
    for i:=1 to length (stemp) do
         st[i]:=ord(stemp[length(stemp)-i+1])-48;
    st[0]:=length(stemp);
end;
procedure sum_two_str(s1,s2:mas; var s3:mas);
var ln, i, per, dod1, dod2, sum:integer;
begin
    per:=0;
    ln:=s1[0];
    for i:=1 to ln do
    begin
         s3[i]:=s1[i]+s2[i]+per;
         per:=s3[i] div 10;
         s3[i]:=s3[i] mod 10;
    end;
    if per=1 then begin s3[i+1]:=per; s3[0]:=s3[0]+1; end;
end;
BEGIN
    readln (m);
    fillchar(old, sizeof(old),0);
    fillchar(mt, sizeof(mt),0);
    fillchar(sm, sizeof(sm),0);
    count:=0;
    dig_to_str (m, sm);
    old:=sm;
    while not(check(sm)) do
    begin
         inc (count);
         perev(old, mt);
         sum_two_str(old, mt, sm);
         new:=sm;
         old:=new;
    end;
    writeln (count);
end.
*****

Комментариев нет:

Отправить комментарий