Россия, Москва, МИЭМ |
Типовые алгоритмы и задачи, решаемые с их помощью
Решение задач с использованием типовых алгоритмов обработки строковых переменных
Задачи "Разбор числа на цифры"
Идея решения: Во всех задачах данной группы число необходимо ввести в строковую ячейку. Затем, применив типовой алгоритм "РАЗБОРА" ЧИСЛА НА ЦИФРЫ, произвести необходимые действия. Ячейка, в которой накапливается произведение в цикле, должна быть предварительно заполнена единицей.
Ввести число. Найти сумму, произведение цифр числа.
Программа на Бейсике:
input "введите число "; a$ n=len(a$) for i=1 to n s=s+val (mid$(a$,i,1)) p=p*val (mid$(a$,i,1)) next print s
Программа на Паскале:
var a: string; n,s,i,x,k:integer; begin writeln ('введите число'); readln (a); n:=length(a); s:=0; р:=1; for i:=1 to n do begin val (copy(a,i,1),x,k); s:=s+x; p:=p*x; end; writeln (s, р); end.
Тест:
-
Ввести число. Найти максимальную цифру числа
Программа на Бейсике:
input "введите число"; a$ n=len(a$) max=val (mid$(a$,1,1)) for i=1 to n if val (mid$(a$,i,1))> max then max=val (mid$(a$,i,1)) next print max, min
Программа на Паскале:
var a: string; n,i,x,k,max: integer; begin writeln ('введите число'); readln (a); n:=length(a); val (copy(a,1,1),x,k); max:=x; for i:=1 to n do begin val (copy(a,i,1),x,k); if x>max then max:=x; end; writeln ('max=',max); end.
Тест:
-
Ввести число. Найти количество нулевых цифр в числе
Программа на Бейсике:
input "введите число"; a$ n=len (a$) for i=1 to n if val (mid$(a$,i,1))=0 then k=k+1 next print k
Программа на Паскале:
var a: string; n,i,x,k,kk: integer; begin writeln ('введите число'); readln (a); n:=length (a); k:=0; for i:=1 to n do begin val (copy(a,i,1),x,kk); if x=0 then k:=k+1; end; writeln ('k=', k); end.
Тест:
-
Определить, является ли число, введенное с клавиатуры числом Армстронга. Число Армстронга: сумма цифр этого числа, возведенных в n-ую степень (n - количество цифр числа) равна самому числу.
Идея решения: Число необходимо ввести в строковую ячейку. Аналогично предыдущей задаче необходимо применить типовой алгоритм РАЗБОРА ЧИСЛА НА ЦИФРЫ. В программе на Паскале возведение числа в n-ую степень реализовано в цикле.
Бейсик:
input "введите число"; a$ n = len (a$) for i=1 to n s=s+val(mid$ (a$,i,1))^n next if s=val(a$) then print "это число Армстронга" else print "это не число Армстронга"
Паскаль:
var a: string; b, i, j, st, n, s, x, k: integer; begin writeln ('введите число'); readln (a); n:=length(a); s:=0; for i:=1 to n do begin val (copy(a,n-i+1,1),x,k); {=возведение числа в степень=} st:=1; for j:=1 to n do st:=st*x; {====================} s:=s+st; end; val (a, x, k); if s=x then writeln ('это число Армстронга') else writeln ('это не число Армстронга'); end.
Тест:
-
Найти цифровой корень числа. Цифровой корень числа получается при сложении цифр числа, затем при сложении цифр вновь полученного числа и так до тех пор, пока в сумме не будет получена одна цифра.
Идея решения: Решение задачи также базируется на типовом алгоритме "РАЗБОРА" ЧИСЛА НА ЦИФРЫ. В решении задачи на Бейсике логическое выражение в цикле While выглядит как Len(A$)>2, а не >1, т.к. функция STR$ записывает один лишний пробел перед словом.
Программа на Бейсике:
input "введите число"; a$ while len (a$) > 2 for i=1 to len (a$) s=s+val (mid$ (a$, i, 1)) next a$=str$ (s) s=0 wend print"цифровой корень числа="; a$
Программа на Паскале:
var a: string; n,s,i,x,k:integer; begin writeln ('введите число'); readln (a); n:=length(a); while n>1 do begin s:=0; for i:=1 to n do begin val (copy(a,i,1),x,k); s:=s+x; end; str(s,a); n:=length(a); end; writeln ('цифровой корень числа=', s); end.
Тест:
-
Перевести число из одной системы счисления в другую.
Идея решения: перевод числа в десятичную систему счисления базируется на типовом алгоритме "РАЗБОРА" ЧИСЛА НА ЦИФРЫ. Перевод из десятичной системы счисления не опирается на рассмотренные выше типовые алгоритмы, но мы приведем и его.
Перевод числа из В-ричной (B<10) в десятичную систему счисления: Бейсик:
input "введите число и основание с.с."; a$, b n = len (a$) for i = 1 to n s=s+val(mid$ (a$,i,1)) *b^(n - i) next print s
Паскаль:
var a: string; b, i, st, n, s, x, k:integer; begin readln (a); readln(b); n:=length(a); s:=0; st:=1; for i:=1 to n do begin val (copy(a,n-i+1,1),x,k); s:=s+x*st; st:=st*b; end; writeln (s); end.
Тест:
Перевод числа из десятичной системы счисления в В-ричную Бейсик:
input "введите число и основание системы"; a, b while a<>0 x = a mod b s = s * 10 + x a = a \ b wend print s
Паскаль:
var a, b, s, x: integer; begin readln (a); readln (b); s:=0; while a<>0 do begin x:=a mod b; s:=s*10 +x; a:=a div b; end; writeln (s); end.
Тест: