1. Решение задач целочисленной арифметики

advertisement
Тема: «Разработка системы алгоритмов по теме
« Решение задач целочисленной арифметики »
Содержание
Введение .......................................................................................................... 3
Урок 1 . Алгоритм Евклида .......................................................................... 4
Урок 2 . Числа Фибоначчи, Армстронга и Мерсена. ................................ 6
Урок 3. Алгоритмы нахождения чисел с заданными свойствами на
целочисленном отрезке................................................................................ 10
Урок
4.
Алгоритмы
нахождения
чисел
с
заданными
характеристиками на целочисленном отрезке .......................................... 14
Урок 5. Перевод чисел из одной системы счисления в другую .............. 17
Урок 6. Задачи о магических квадратах. ................................................... 20
Заключение ................................................................................................... 24
Литература: ................................................................................................... 25
2
Введение
Алгоритм Евклида. Числа Фибоначчи, Армстронга и Мерсена.
Алгоритмы нахождения чисел с заданными свойствами на
целочисленном отрезке : простые, совершенные, автоморфные числа, числаполиндромы и пифагоровы тройки, дружественные числа и числа-близнецы.
3
Алгоритм Евклида
Задача 1. Определите, является ли введенное число а простым или составным,
и найдите все его делители.
Алгоритм решения:
Var
a,i:longint;
f: boolean;
BEGIN
Readln(a); {ввод числа}
f: =false;
for i:=2 to (a div 2) do {поиск делителей числа от 2 до a div 2}
if a mod i = 0 then
begin
f: =true;
Writeln (‘Делитель числа a:’,i)
еnd;
if f then Writeln(‘Число’,а,’ — составное’)
else Writeln(‘Число’,а’ — простое’)
END.
Задача 2. Найти и вывести без повторений все простые делители целого
числа m.
Алгоритм решения:
Var
l: boolean;
m,j : integer;
Begin
Write('Введите число : ');
Readln(m);
l := true;
4
j := 2;
while m<>1 do
begin
if m mod j =1 then
begin
if l then Writeln(j);
m := m div j;
l := false
end
else
begin
j := j+l;
l := true
end
end
End.
1. Алгоритм решения:
Var
i, n , k :word;
Begin
Read ( n) ;
k:=1;
for i:=1 to n do
if n mod i =0 then
{если m делится на i , то i - делитель}
begin
writeln (i);
k:=k+1;
{подсчет количества делителей}
end;
writeln (k);
5
end.
2. Алгоритм решения:
label m1;
Var
a,i:integer;
ostatok:real;
begin
writeln ('Введите целое число');
readln(a);
i:=2;
m1: if i<=9 then
begin
{вычисление остатка}
ostatok:=a mod i;
if ostatok=0 then writeln('Делится на ’, i)
else writeln (‘He делится на’, i);
{увеличение делителя}
i:=i+l;
goto m1;
end
End.
Числа Фибоначчи, Армстронга и Мерсена.
Задача 1. Построить алгоритм вычисления n-го числа Фибоначчи с
использованием рекурсий.
Алгоритм решения:
Var
n:integer;
Function fib(k: integer):longint;
begin
if k<=1 then fib:=1
{при k=0 fib=1}
{иначе рекурсивная формула}
else fib:=fib(k-1)+fib(k-2)
6
end;
Begin
Write(‘Введите числоN=’);
Readln(n);
Writeln(‘Число Фибоначчи’);
{обращение к функции fib}
Writeln(fib(n));
End.
Натуральное число А, состоящее из n цифр, называется числом Армстронга,
если оно равно сумме своих цифр, возведенных в степень n. Например, 13+ 53 +
+33 = 153.
Задача 2. Существует строка текста, состоящая из 1, 2, 3, 4-значных
натуральных чисел, отделенных друг от друга пробелом, в конце строки стоит
точка. Найдите и выведите все числа Армстронга в этой строке.
Алгоритм решения:
VAR
ol:array[1..4] of integer; {массив для хранения цифр числа}
cod,i,k,n,j: integer;
o,s,vs:longint;
stl.sl,: string;
f: boolean; {признак отсутствия в строке чисел Армстронга}
BEGIN
Writeln (‘Введите строку из цифр’);
readln(stl);
k: = l; n: = l; f: = false;
while k< =length(stl) do {просмотр строки текста посимвольно}
begin
if (stl[k]=‘ ‘) or (stl[k]=‘.‘) then
begin
si: =copy(stl,n,k - n); {выделим запись натур. числа}
7
val(sl,o,cod); {преобразуем строку в числовое представление}
s:=0;
for i: = 1 to length(sl) do
begin
val(sl[ij,ol[i],cod); {вычисляем сумму п-степеней цифр числа}
vs: = l;
for j: =1 to length(sl) do
vs: =vs * ol[i];
s: =s + vs
end;
if o = s then
begin
writeln(‘Число Армстронга :’,о);
f: =true
end;
n:=k+l
end;
inc(k)
end;
if not(f) then
writeln(‘Чисел Армстронга в строке нет’)
END.
1.Найти число Фибоначчи Fn ,если F0=1, F1=1, Fn= Fn-1 + Fn-2 и Fn >k.
Алгоритм решения:
Var
f0,f1,f,k:integer;
Begin
f0:=1; f1:=1;
{начальные данные}
read(k);
f:=2;
8
while f<=k do
begin
f0:=f1;
f1:=f;
f:=f0+f1;
{формула Фибоначчи}
end;
writeln(‘f=’,f);
End.
Задача 2. На натуральном отрезке [а, b] найти все идеальные числа. Натуральное
число является идеальным, когда оно равно сумме его делителей, за исключением
самого числа.
Алгоритм решения:
Var
a,b,S,l,i:longint;
begin
writeln ('Введите число а ');
read (a);
writeln ('Введите число b>a ');
read (b);
for i:=a to b do
begin
S:=0;
{начальное значение суммы делителей}
for l:=1 to (i div 2) do
if i mod l=0 then S:=S+1;
{нахождение суммы делителей}
if S=i then writeln(i,' - идеальное число')
end;
readln; readln
end.
9
Алгоритмы нахождения чисел с заданными свойствами на
целочисленном отрезке
Задача 1. Дано целое число А. Выделить все цифры этого числа и найти
произведение всех нечетных его цифр.
Алгоритм решения:
Var
x,r,q:longint;
Pr:longint;
Begin
writeln('Введи целое число x:');
read(x);
r:=x mod 10;
{остаток от деления}
q:=x div 10;
{частное от деления}
if r mod 2<>0 then Pr:=r {если остаток нечетный, то произведение = остатку}
else Pr:=1; {если остаток четный, то произведение = 1}
while q>0 do
begin
r:=q mod 10;
{остаток от деления}
q:=q div 10;
{частное от деления}
if (r mod 2)<>0 then Pr:=Pr*r;
end;
writeln('Произведение нечетных цифр числа=',Pr);
readln;readln
End.
Задача 2. Дан натуральный отрезок [a, b]. Найти в границах этого отрезка сумму
всех натуральных чисел, которые делятся на 2 или на 5.
Алгоритм решения :
Var
10
a,b:longint;
Sum:longint;
i:integer;
Begin
writeln('Введите концы отрезка:');
write('a=');
read(a);
write('b=');
read(b);
Sum:=0;
for i:=a to b do {нахождение суммы чисел, удовлетворяющих условию}
if (i mod 2=0) or (i mod 5=0) then Sum:=Sum+i;
writeln('Sum=',Sum);
readln; readln;
End.
Задача 3. Составьте программу ввода целого трехзначного числа, формирование
и вывод числа с обратным порядком цифр.
Алгоритм решения :
var
abc,a,b,c,ab:integer;
begin
writeln ('Введите трехзначное число');
readln(abc);
c:=abc mod 10;
{отделение последней цифры}
ab:=(abc-c) div 10;
{отделение первых двух цифр}
b:=ab mod 10;
{отделение второй цифры}
a:=(ab-b) div 10;
{отделение первой цифры}
writeln(c,b,a);
{вывод цифр числа в обратном порядке}
readln;
end.
Задача 4. Составить программу ввода натурального числа n и определение
11
того, является ли оно полиндромом, т.е. таким, десятичная запись которого
читается одинаково слева направо и справа налево.
Алгоритм решения:
var
l,m,n,k:longint;
begin
writeln ('Введите натуральное число n');
readln(n);
k:=n; m:=0;
while k>0 do
begin
l:=k mod 10; {отделение остатка}
k:=k div 10; {отделение частного деления на 10}
m:=l+m*10 {заполнение числа цифрами
в обратном порядке}
end;
if m=n then writeln ('Число ',n,' является полиндромом')
else writeln ('He является полиндромом');
readln;
end.
Задача 1. Составить программу ввода натурального числа n и определения
того, является ли оно совершенным. Совершенное число n равно сумме всех
своих делителей, не превосходящих само n.
Алгоритм решения :
var
number,count,sum:integer;
begin
repeat
12
write(‘Введитe натуральное число n= ');
readln(number);
until n>0;
sum:=l;
for count:=2 to number div 2 do
if (number mod count) = 0 then sum:=sum+count;
{подсчет суммы делителей}
if number = sum then writeln(number, '-совершенно число')
else writeln(number,'- не совершенное число')
end.
Задача 2. Найдите на натуральном отрезке [a, b] четное число с наибольшей
суммой всех своих делителей. Само число и единицу не учитывайте.
Алгоритм решения:
Var
m,p,s,max,i,a,b: longint;
BEGIN
Write (‘Введите числа А и В (А<В):’);
Readln(a);
Readln(b);
if odd(a) {если а нечетно, увеличить его на единицу}
then a: =а + 1;
max: =2;
while а<=b do {просмотр всех четных чисел на отрезке}
begin
s:=2;
for i:=3 to a div 2 do
if (a mod i)=0 then s:=s+i; {вычисление суммы делителей}
if max< =s then
begin
max:=s;
m: =a
end;
13
a:=a + 2;
end;
Writeln(‘Четнoe число с наибольшей суммой своих делителей :’,m)
END.
Алгоритмы нахождения чисел с заданными характеристиками на
целочисленном отрезке
Задача 1. Найдите и выведите все тройки чисел на натуральном интервале
чисел [a,b], удовлетворяющие условию: если l, m, n Є [a,b] .то эта тройка чисел
удовлетворяет равенству l2 = m2 + n2.
Алгоритм решения:
Var
a,b,i,j :longint;
Begin
Write(‘Введите числа А и В (А<В):’);
Readln(a);
Readln(b);
for i: =a to b-1 do
for j: = i + 1 to b do
if (i * i+j*j>a) and (i*i + j * j < b) then
Writeln(‘( ‘,i,’ , ’,j,’ , ’,trunc(sqrt(i * i + j * j)),’ )’)
end.
Задача 2. Определите все натуральные числа на отрезке [10, 20000], сумма
цифр каждого из которых, возведенная в некоторую степень, дает само число. На
пример, 18 * 18 * 18 = 5832, 9 * 9 = 81.
Алгоритм решения:
Var
k,n,i,s:longint;
14
Begin
i: = 10;
while i< =20000 do
begin
n: = i;
s:=0; {определение суммы цифр числа}
while n> = 1 do
begin
s: =s + n mod 10;
n: =n div 10
end;
n: =i;
k:=s; {умножение суммы цифр на саму себя}
while (s<n) and (S<>1) do
s: = s * к;
if s=n then
Writeln(i);
i:=i+l
end
end.
Задача 3. Найдите на натуральном отрезке [a, b] все пары простых чисел,
разность между которыми равна 2. Такие пары чисел, например3 и 5, 5
и 7, 11 и 13, называют числами-близнецами.
Алгоритм решения:
Var
j,i,m,n,a,b,p,k:word;
c1,c2:boolean;
Begin
writeln('Введите левый конец отрезка,a>0 ');
readln(a);
writeln('Введите правый конец отрезка,b>0 ');
15
readln(b);
p:=0;
for i:=a to b do
for j:=i+1 to b do
begin
{Является ли число i простым}
k:=0;
for m:=1 to i do
if i mod m=0 then k:=k+1;
if k=2 then c1:=true
else c1:=false;
{Является ли число j простым}
k:=0;
for n:=1 to j do
if j mod n=0 then k:=k+1;
if k=2 then c2:=true
else c2:=false;
if c1 and c2 then
begin
k:=j-i;
if k=2 then
begin
writeln('Числа ',i, ' и ',j ,' являются числами-близнецами ');
p:=p+1;
end;
end;
end;
if p=0 then writeln('Таких чисел нет');
readln;
end.
Задача 4.
Найдите все пары дружественных чисел на натуральном отрезке
[a,b]. Два натуральных числа называются дружественными, если каждое из них
равно сумме всех делителей другого, кроме самого этого числа.
16
Алгоритм решения:
Var
a,b,i,j:integer;
v:array[1..100] of integer;
begin
writeln('Введите a,b');
readln(a,b);
for j:=a to b do
for i:=1 to j do
if j mod i=0 then v[j]:=v[j]+i;
for i:=a to b do
for j:=a to b do
if (i=v[j]-i) and (i<>j) and (j=v[i]-j)
then writeln('Дружественные числа ',i,' i ',j);
writeln;
{ for i:=a to b do write(v[i],' '); }
readln;
end.
5. Перевод чисел из одной системы счисления в другую
Цели обучения:
 рассмотреть алгоритмы перевода из одной системы счисления в другую;
 закрепление умений и навыков решения целочисленных задач.
Задача 1. Составить алгоритм перевода из в 10-ой системы счисления в 2ую систему счисления.
Алгоритм решения:
Var
n,s,p: longint;
17
BEGIN
write ('Введите число');
readln(n);
s:=0;
p: = l;
repeat
s: =s + (n mod 2)*p; {дв. число + остаток от деления дес. числа на 10}
p: =p* 10;
n: =n div 2
until n< 1;
writeln('s = ',s)
END.
Из 10-ой системы счисления в 16-ричную систему счисления.
Алгоритм решения:
var
n: longint;
s,t:string;
BEGIN
write ('Введите число');
readln(n);
s:='';
repeat
case n mod 16 of
{выбор остатка числа при делении на 16
и замена его на соответствующий символ}
0..9: begin
str(n mod 16,t);
s:=t+s;
end;
10: s:='A'+s;
18
11: s:='B'+s;
12: s:='C'+s;
13: s:='D'+s;
14: s:='E'+s;
15: s:='F'+s;
end;
n:=n div 16
until n< 1;
writeln('s = ',s)
END.
1. Составить алгоритм перевода из в 10-ой системы счисления в любую
другую систему счисления с основанием меньшим 10. Переводимое число в
10-ой системе счисления и новое основание системы счисления ввести с
клавиатуры.
Алгоритм решения:
Var
o: byte;
l,s,v:longist;
Begin
writeln(‘Введите основание с/c’);
readln(o);
writeln(‘Введите число L’);
readln(l);
s:=0; v:=1;
while l>1 do
begin
s:=s+(l mod o)*v; {число + остаток от деления
дес. числа на основание}
v:=v*10;
l:=l div o;
19
end;
writeln(‘Число с новой с/с’,s)
End.
6. Задачи о магических квадратах.
Задача 1. Магическим называется квадрат, в котором сумма чисел по всем
горизонталям, вертикалям и диагоналям совпадает. Найти все магические квадраты
3x3 составленью из девяти цифр (1 ..9).
Пример:
2
7
6
9
5
1
4
3
8
Алгоритм решения:
label
11,12,13,14,15,16,17,18;
var
al,a2,a3,a4,a5,a6,a7,a8,a9,x,n:integer;
begin
writeln(‘Поиск магических квадратов 3*3...');
for al :=1 to 9 do begin
for a2:=l to 9 do begin
for a3:=l to 9 do begin
for a4:=l to 9 do begin
for a5:=1to 9 do begin
for a6:=l to 9 do begin
20
for a7;=l to 9 do begin
for a8:=l to 9 do begin
for a9:=l to 9 do begin
if (a9=a8) or (a9=a7) or (a9=a6) or (a9=a5) or (a9=a4) or (a9=a3) or (a9=a2) or (a9=al)
then goto 11;
if (a8=a7) or (a8=a6) or (a8=a5) or (a8=a4) or (a8=a3) or (a8=a2) or (a8=al) then goto
12;
if (a7=a6) or (a7=a5) or (a7=a4) or (a7=a3) or (a7=a2) or (a7=al) then goto 13;
if (a6=a5) or (a6=a4) or (a6=a3) or (a6=a2) or (a6=al) then goto 14;
if (a5=a4) or (a5=a3) or (a5=a2) or (a5=al) then goto 15;
if (a4=a3) or (a4=a2) or (a4=al) then goto 16;
if (a3=a2) or (a3=al) then goto 17;
if(a2=al)then goto 18;
x:=al+a2+a3;
if (a4+a5+a6=x) and (a7+a8+a9=x) and (al+a4+a7=x) and (a2+a5+a8=x) and
(a3+a6+a9=x) and (al+a5+a9=x) and (a3+a5+a7=x) then
begin
n:=n+l;
writel ('Квадрат ',n);
writeln(al,' ',a2,' r,a3);
writeln(a4,' ',a5,' ',a6);
writeln(a7,' ',a8,' ',a9);
readln;
end;
ll:end;12:end;13:end;14:end;15:end;16:end;17:end;18:end;end;
end.
Задача 1 .Написать алгоритм определения количества билетов с 6-значными
номерами, у которых сумма первых 3 десятичных цифр равна сумме 3 последних
десятичных цифр.
Идея решения. Просматриваем числа от 0 до 999999. Делим число на 2 части:
21
первые 3 цифры и последние 3 цифры, находим сумму цифр каждой из частей,
сравниваем результат.
Алгоритм решения:
function summ(x:longmt):byte; {возвращает сумму цифр числа}
var
k,l:byte;
y:longint;
begin
y:=x;
l:=0;
while (y<>0) do
begin
k:=y mod 10;
y:=y div 10;
l:=l+k
end;
summ:=l;
end;
{----------------------------------------}
var
wl,w2,i,j,count:longint;
n,m:byte;
begin
count:=0;
for j:=0 to 999999 do
begin
wl:=j div 1000;
w2:=j mod 1000;
if summ(wl) = summ(w2) then
begin
count:=count+1;
writeln(j,’’,count);
22
end;
end;
End.
23
Заключение
Современное общество предъявляет новые требования к поколению,
вступающему в жизнь. Надо обладать умениями и планировать свою
деятельность, и находить информацию, необходимую для решения поставленной
задачи, и строить информационную модель исследуемого объекта или процесса, и
эффективно использовать новые технологии. Такие умения необходимы сегодня
каждому молодому человеку.
Поэтому первой и важнейшей задачей школьного курса информатики
является формирования у учащихся соответствующего стиля мышления.
Цель данной курсовой работы - разработка практических заданий
для
учителя по организации учебного процесса при изучении темы «Решение задач
целочисленной арифметике в 10 классе », разработка целей и задач, проведение
тематического планирования.
Изучение этой темы имеет большое значение для развития у школьников
теоретического, творческого мышления, а также формирования так называемого
операционного мышления, направленного на выбор оптимальных решений.
Кроме того, изучение этой темы очень важно для обучения школьников
вообще, так как ''человек чему-то научается только в том случае, если у него в
голове складывается блок-схема действия, выделены подпрограммы и проложены
информационные связи. Таким образом, человек неизмеримо усилит свой
интеллект, если сделает частью своей натуры способность планировать свои
действия, вырабатывать общие правила и способ их применения к конкретной
ситуации, организовать эти правила в осознанную и выразимую структуру, одним словом, сделается программистом''
.
24
Литература:
1. Программа средней общеобразовательной школы «Информатика VIII-XI
классы». – Минск, 2000. – 72 с.
2. Павловский А.И., Пупцев А.Е., Гращенко П.Л. Информатика: Учебное
пособие для 10-го кл. с углубл. изучением информатики общеобразоват. шк. с
русским языком обучения. – Мн., Нар. асвета, 2000. – 223 с.: ил.
3. Культин Н. «Turbo Pascal в задачах и примерах». – Санкт-Петербург,2004. –
256 с.
4. Алексеев Е.Р., Чесноков О.В., Павлыш В.Н., Словинская Л.В. «Турбо
Паскаль 7.0». – Москва,2004. – 394 с.
5. Информатизация образования №9 ,1997г.,Мн.-130с.
25
Download