Показать сообщение отдельно
Старый 05.11.2015, 20:01   #17 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Исправил. Теперь и восьмерки отрабатывает:
Код:
Var
 S,S1,S2,Dig_S,Dig_S1:String;
 DR,Code,DD:Word;
 i,k,Dig:Byte;
 b:boolean;

Procedure DigitalRoot(Sd:String; var Sr:String; var D:Word);
var
 P:Word;
 L,j,m:Byte;
begin
 L:=Length(Sd);
 P:=0;
 for j:=1 to L do
  begin
   Val(Sd[j],m,Code);
   Inc(P,m);
  end;
 STR(P,Sr);
 D:=P;
 if P>=10 then DigitalRoot(Sr,Sr,D);
end;

Begin
 Writeln('Enter the number (up to 255 digits):');
 Readln(S);
 DigitalRoot(S,S1,DR);
 b:=false;
 i:=0;
 Repeat
  Inc(i);
  Val(S[i],Dig,Code);
  k:=10;
  repeat
   Dec(k);
   STR(DR+k,Dig_S);
   DigitalRoot(Dig_S,Dig_S1,DD);
  until ((Dig+k<10) and ((DD mod 3)=0)) or (k=1);
  if ((Dig+k<10) and ((DD mod 3)=0)) then
   begin
    b:=true;
    Dig:=Dig+k;
   end;
 Until b or (i=Length(S));
 if b then
  begin
   S1:='';
   for k:=1 to i-1 do
    S1:=S1+S[k];
   STR(Dig,Dig_S);
   S1:=S1+Dig_S;
   for k:=i+1 to Length(S) do
    S1:=S1+S[k];
  end
 else
  begin
   S1:='';
   for k:=1 to Length(S)-1 do
    S1:=S1+S[k];
   DigitalRoot(S1,S2,DR);
   Val(S[Length(S)],Dig,Code);
   repeat
    Dec(Dig);
   until ((DR+Dig) mod 3)=0;
   STR(Dig,Dig_S);
   S1:=S1+Dig_S;
  end;
 Writeln('Result:');
 Writeln(S1);
 Readln
End.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070