Вывести к-ую цифру арифмитической последовательности

Вывести к-ую цифру арифмитической последовательности 1234567891011...  - как решить такую задачу на языке Паскаль попытаемся рассказать на этой странице.

 На уроках программирования в 9 классе преподаватель предложил решить эту задачу. На следующий день отличник принес такой вариант:

program f;
uses crt;
 
var k,i,n:integer;  {описание переменных}
    s,x:string;
 
begin
write('До какого натурального числа сформировать последовательность? ');
readln(n); {считываем натуральное число}
 
x:='';
for i:=1 to n do  {цикл от 1 до введенного числа }
    begin
    str(i,s);
    x:=x+s;   {формируем строку из последовательности цифр}
    end;
 
clrscr;  {чистим экран}
writeln (x); {выводим получившуюся последовательность цифр}
writeln;
 
write('Введите K: '); readln(k); {считываем K}
writeln('Ответ: ',x[k]);         {выводим ответ}
 
readln;
end.      

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

program wsegfer;
var a,c,d,k,col,n,a1,col1,s,n1,ost,nom:integer;
label metka1;
begin
writeln('введите число');
readln(k);
col:=0; {общее количество цифр в числах}
col1:=0; {количество цифр в числе}
s:=1;{Вспомогательная переменная}
n:=1; {Число в котором считаем количество цифр, для обработки в программе}
n1:=1;
  metka1: repeat
     col1:=col1+1;
     s:=n mod 10;
     n:= n div 10;
          until n=0;
 {Начинаем новый блок №1}
      if (col1+col)< k then
        begin
          col:=col1+col;
          col1:=0;
          n1:=n1+1;
          n:=n1;
   goto metka1
         end;
{новый блок 2 }  
s:=0;
col1:=0;
c:=n1;{нужное число}
  while n1<>0 do
    begin
     s:=n1 mod 10;
     n1:=n1 div 10;
     col1:=col1+1;
    end;
  ost:=k-col;
  nom:=abs(ost-(col1+1));{номер нужной цифры цифры с конца числа n1}
  d:=0;{переменная для счёта количества цифр с конца числа n1}
  s:=0;
     repeat
       d:=d+1;
       s:=c mod 10;
       c:=c div 10;
     until d=nom;
writeln ('к-ая цифра в арифметической последовательности = ',s);
end.

  Возможно есть способы ее оптимитизировать, но мы остановились на данном варианте. Программу разбивали на логические блоки, что бы не запутаться. Как видите в программе несколько раз используется алгоритм выделение цифр из числа, разными методами. И самое сложное в этом варианте вот эта формула, которая позволяет вычислить порядковый номер номер нужной нам цифры в числе начиная с конца  nom:=abs(ost-(col1+1)), где ost-порядковый номер цифры в числе с начала, col1- количество цифр в числе.

Автор: Лобанева Анастасия 9 класс

Добавить комментарий


Защитный код
Обновить

Яндекс.Метрика