вівторок, 1 березня 2016 р.


Задача1. IІ етапу Всеукраїнської учнівської олімпіади
з інформатики 2015-2016 н.р.

Задача 1. «Астролог» (20 балів)

Ім’я вхідного файлу: input.txt
Ім’я вихідного файлу: output.txt
Максимальний час роботи на одному тесті: 1с
Один з астрологів визначає щасливі і нещасливі дні так: він виписує підряд число, номер місяця і рік. В отриманому числі додає всі цифри, в новому отриманому числі знову додає всі цифри і так далі, доки чергова сума цифр не стане однозначним числом. Це число і характеризує щасливість дня.
Формат вхідного файлу.
Дата вводиться в форматі ррррммдд.
Формат вихідного файлу.
Виведіть рядок, який містить одне число, яке визначає щасливість дати.
Приклади файлів
input.txt
output.txt
20000101
4
19990102
4

Дана задача легко розв'язується з застосуванням функцій div, mod, але сума восьми цифр може бути двоцифровим числом, що не перевищує 72(=8*9), отже потрібно використати команди розгалуження. Так як сума двоцифрового числа також може бути двоцифровим числом(наприклад, 1+9=10), то розгалуження слід використати два рази:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var f,g:text; a,b,c,d,e,k,l,m,s:integer;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f); rewrite(g);
  read(f,a);
  s:=0;
  b:=a div 10000000;
  a:=a mod 10000000;
  c:=b div 1000000;
  a:=a mod 1000000;
  d:=a div 100000;
  a:=a mod 100000;
  e:=a div 10000;
  a:=a mod 10000;
  k:=a div 1000;
  a:=a mod 1000;
  l:=a div 100;
  a:=a mod 100;
  m:=a div 10;
  a:=a mod 10;
  s:=a+b+c+d+e+k+l+m;
  if s>9 then begin
  a:=s div 10;b:=s mod 10;s:=a+b
  end;
  if s>9 then begin
  a:=s div 10;b:=s mod 10;s:=a+b
  end;
  write(g,s);
  close(f);
  close(g);
end.

Для спрощення розв’язку задачі можна використати команди циклу, так як маємо повторення команд для визначення цифр числа та перевірки значення їх суми:

program astrolog;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var f,g:text; a,b,s,c:integer;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f); rewrite(g);
  read(f,a);
  while a>=10 do begin
  s:=0; b:=a;
  while b>0 do begin
  c:=b mod 10;
  b:=b div 10;
  s:=s+c;
  end;
  a:=s; end;
  write(g,s);
  close(f);
  close(g);
end.

Можна також використати роботу з рядками:

program  astrolog;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var f,g:text; a,b,c,s,i:integer;r:string;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f); rewrite(g);
  read(f,r);
  s:=0;
  for i:=1 to length(r)do begin
  val(r[i],a,b);
  s:=s+a end;
  while s>9 do begin
  b:=s div 10;
  c:=s mod 10;
  s:=b+c;
  end;
  write(g,s);
  close(f);
  close(g);
end.

Немає коментарів:

Дописати коментар