Опубликован: 21.03.2012 | Доступ: свободный | Студентов: 2942 / 222 | Оценка: 4.44 / 4.19 | Длительность: 06:43:00
Специальности: Программист
Лекция 3:

Типовые алгоритмы и задачи, решаемые с их помощью

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

Решение задач с использованием типовых алгоритмов обработки строковых переменных

Задачи "Разбор числа на цифры"

Идея решения: Во всех задачах данной группы число необходимо ввести в строковую ячейку. Затем, применив типовой алгоритм "РАЗБОРА" ЧИСЛА НА ЦИФРЫ, произвести необходимые действия. Ячейка, в которой накапливается произведение в цикле, должна быть предварительно заполнена единицей.

Ввести число. Найти сумму, произведение цифр числа.

Программа на Бейсике:

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.

Тест:

Дано: 1234
Результат: 10 24
  1. Ввести число. Найти максимальную цифру числа

    Программа на Бейсике:

    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.
    

    Тест:

    Дано: 183058436
    Результат: 8
  2. Ввести число. Найти количество нулевых цифр в числе

    Программа на Бейсике:

    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.

    Тест:

    Дано: 10500304500
    Результат: K=6
  3. Определить, является ли число, введенное с клавиатуры числом Армстронга. Число Армстронга: сумма цифр этого числа, возведенных в 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.

    Тест:

    Дано: 153 1634
    Результат: Это число Армстронга Это число Армстронга
  4. Найти цифровой корень числа. Цифровой корень числа получается при сложении цифр числа, затем при сложении цифр вновь полученного числа и так до тех пор, пока в сумме не будет получена одна цифра.

    Идея решения: Решение задачи также базируется на типовом алгоритме "РАЗБОРА" ЧИСЛА НА ЦИФРЫ. В решении задачи на Бейсике логическое выражение в цикле 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.

    Тест:

    Дано: 123456
    Результат: 3
  5. Перевести число из одной системы счисления в другую.

    Идея решения: перевод числа в десятичную систему счисления базируется на типовом алгоритме "РАЗБОРА" ЧИСЛА НА ЦИФРЫ. Перевод из десятичной системы счисления не опирается на рассмотренные выше типовые алгоритмы, но мы приведем и его.

    Перевод числа из В-ричной (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.

    Тест:

    Дано: 1101, 2
    Результат: 13
    Перевод числа из десятичной системы счисления в В-ричную

    Бейсик:

    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.

    Тест:

    Дано: 13, 2
    Результат: 1101
< Лекция 2 || Лекция 3: 1234 || Лекция 4 >