Делимость чисел

1. Задано натуральное число А. Вычислить сумму цифр числа.

Пример ввода: 71203

Пример вывода: 13

s:=0;

while a>0 do

begin

cif:=a mod 10;

s:=s+cif;

a:=a div 10;

end;

writeln(‘сумма =’, s);

2. Задано натуральное число А. Получить число B являющееся перевертышем числа А.

Пример ввода: 71203

Пример вывода: 30217

b:=0;

while a>0 do

begin

cif:=a mod 10;

b:=b*10+cif;

a:=a div 10;

end;

writeln(‘b =’, b);

3. Задано число А (1<A<1 000 000 000). Получите число B, поменяв местами первую и последнюю цифру числа A.

Пример ввода: 71203

Пример вывода: 31207

4. Задано число А (1<A<1 000 000 000). Получите число B, добавив вначале и в конце числа цифру 9.

Пример ввода: 71203

Пример вывода: 9712039

5. На заданном интервале натуральных чисел от N до M найти все палиндромы (палиндромом будем называть число, если его запись читается одинаково с начала и с конца). Данные корректны (0<N<M).

Пример ввода: 80 130

Пример вывода: 88 99 101 111 121

kl:=0;

for i:=N to M do

begin

a:=i;

b:=0;

while a>0 do

begin

cif:=a mod 10;

b:=b*10+cif;

a:=a div 10;

end;

if b=i then

begin

kl:=1;

write(i, ‘ ’);

end;

end;

if kl=0 then writeln(‘палиндромов нет’);

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

6. Задано натуральное число А. Найдите все делители этого числа.

Пример ввода: 60

Пример вывода: 1 2 3 4 5 6 10 12 15 20 30 60

I способ

Просматриваем все натуральные числа от 1 до A, и выдаём на экран те из них на которые А делится без остатка.

readln (a);

for i:=1 to a do

if a mod i = 0 then write(i, ‘ ’);

Проанализируем данный способ. При А равном например 1 028 764 800 будет выполнено соответственно более миллиарда операций.

II способ

Ускорим данный алгоритм. Понятно, что после половины числа (514 382 400) делителей быть не может. Т.е. искать делители на промежутке от А/2 до А бесполезно. Такое простое усовершенствование даёт экономию по времени в 2 раза.

readln (a);

for i:=1 to (a div 2) do

if a mod i = 0 then write(i, ‘ ’);

write(a);

III способ

Этот способ вытекает из соображения, что все делители числа можно сгруппировать парами: делитель, частное.

Например для числа 60: 1 и 60, 2 и 30, 3 и 20, 4 и 15, 5 и 12, 6 и 10.

Причём ясно, что числа первой группы меньше sqrt(А), а числа второй группы больше sqrt(А).

Т.о. достаточно просмотреть все натуральные числа от 1 до sqrt(А) и выдать на экран те из них, на которые А делится без остатка (это будут числа первой группы) и частное от деления (это будут числа второй группы)

readln (a); k:=round(sqrt(a));

for i:=1 to k do

if a mod i = 0 then write(i, ‘ ’,a div i, ‘ ’);

Проанализируем данный способ.

Для числа А порядка 109 данный способ будет работать в 33 000 раз быстрее чем первый.

Но и у него есть существенный недостаток. При выводе на экран числа не отсортированы в порядке возрастания, а перемешаны парами.

Напишем 4 способ, в котором при большой скорости выполнения алгоритма вывод чисел будет осуществляться в порядке возрастания.

IV способ

readln (a); k:=round(sqrt(a));

for i:=1 to k do

if a mod i = 0 then write(i, ‘ ’);

for i:=1 to k do

if a mod i = 0 then write(a div i, ‘ ’);

Данный алгоритм требует усовершенствования для чисел являющихся полными квадратами.

7. Дано натуральное число А. Является ли оно простым.

Пример ввода: 60 13

Пример вывода: составное простое

Число называется простым, если оно имеет два делителя: 1 и самого себя.

Если делителей больше двух, то число называется составным.

Число 1 не относится не к простым не к составным.

Данную задачу можно решить, используя решения предыдущей задачи. Достаточно найти количество делителей, и зная количество ответить, является ли число простым или составным.

I cпособ

Он будет заключаться в том, что заданное натуральное число делим на все числа от 1 до A и подсчитываем количество делителей. Если количество делителей равно 2, то число является простым, иначе составным.

readln(a);

kol:=0;

for i:=1 to a do

if a mod i=0 then inc(kol);

if kol=2 then writeln('простое') else writeln ('не простое');

II способ

Можно ускорить предыдущий алгоритм в два раза, если учесть, что у натурального числа A между A/2 и A делителей нет.

readln(a);

kol:=0; k:=a div 2;

for i:=2 to k do

if a mod i=0 then kol:=kol+1;

if kol=0 then writeln('простое') else writeln ('не простое');

Если брать значения A достаточно большие, то и первый и второй алгоритм будет работать долго.

III способ

Если у натурального числа A до корня квадратного нет делителей, то делителей не будет и после корня квадратного.

readln(a);

kol:=0; k:=round(sqrt(a))+1;

for i:=2 to k do

if a mod i=0 then kol:=kol+1;

if kol=0 then writeln('простое') else writeln ('не простое');

Данный алгоритм работает быстро при любых значениях n. Но и его можно ускорить.

IV способ

Остановим алгоритм, если количество делителей перестанет быть равным 0.

readln(a);

kol:=0; k:=round(sqrt(a))+1;

i:=2;

while (i<=k) and (kol=0) do

begin

if a mod i=0 then kol:=kol+1;

i:=i+1;

end;

if kol=0 then writeln('простое') else writeln ('не простое');

Vспособ

Будем проверять делится ли число на 2, а далее только на нечётные числа.

readln(a);

kol:=0; k:=round(sqrt(a))+1;

if a mod 2=0 then kol:=kol+1;

i:=3;

while (i<=k) and (kol=0) do

begin

if a mod i=0 then kol:=kol+1;

i:=i+2;

end;

if kol=0 then writeln('простое') else writeln ('не простое');

8. На диапазоне чисел от M до N (1<M<N - натуральные) найти все простые числа.

Пример ввода: 13 40

Пример вывода: 13 17 19 23 29 31 37

Данную задачу, как и задачу 5 можно совершенствовать.

Перебираем все натуральные числа от M до N и каждое число проверяем, является ли оно простым (используем V способ задачи 6)

readln (m, n);

for j:=m to n do

begin

kol:=0; k:=round(sqrt(j))+1;

if j mod 2=0 then kol:=kol+1;

i:=3;

while (i<=k) and (kol=0) do

begin

if a mod i=0 then kol:=kol+1;

i:=i+2;

end;

if kol=0 then write(j, ‘ ’);

end;

9. На диапазоне чисел от M до N (1<M<N - натуральные) найти все простые числа (используя “Решето Эратосфена”)

var n,m,i,j:longint;

f1,f2:text;

a:array[1..1000000] of byte;

Begin

assign(f1,'input.txt'); assign(f2,'output.txt');

reset(f1); rewrite(f2);

readln(f1,m,n);

for i:=1 to n do

a[i]:=1;

a[1]:=0;

for i:=2 to (round(sqrt(n))) do

begin

j:=i*i;

while (j<=n)and(a[i]<>0) do

begin

a[j]:=0;

j:=j+i;

end;

end;

for i:=m to n do

if a[i]=1 then write(f2,i,' ');

close(f1); close(f2);

End.

10. Задано натуральное число А. Разложите это число на простые множители.

Пример ввода: 180

Пример вывода: 2 2 3 3 5

readln (a);

i:=2;

while a>1do

if a mod i=0 then

begin write (i,‘ ’); a:=a div i; end

else

inc(i);

Задачи для самостоятельного решения

1. Задано натуральное число N. Подсчитать сумму делителей числа N.

2. Задано натуральное число N. Среди всех делителей числа N, найти, и вывести те, которые являются простыми числами.

3. Найти 100 первых простых чисел.

4. Дано четное число n>2. Проверить для этого числа гипотезу Гольдбаха. Эта гипотеза (по сегодняшний день не опровергнутая и полностью не доказанная) заключается в том, что каждое четное n, большее двух, представляется в виде суммы двух простых чисел.

5. Дано натуральное число n. Выяснить, имеются ли среди n, n+1, ..., 2n близнецы, т.е. простые числа, разность между которыми равна двум.

6. Проверить теорему П. Л. Чебышева, что между двумя натуральными числами n и 2n имеется, по крайней мере, одно простое число.

7. Найти все простые числа меньшие заданного числа n, являющиеся числами Мерсена. Числа Мерсена соответствуют формуле (2k-1, k - натуральное).

8. Учитывая, что простыми числами, большими 3, могут быть только числа вида: 6n+1 и 6n-1, составить программу нахождения всех простых чисел больших a и меньших b (a, b – заданы).

9. Задано натуральное число n. Подсчитать количество пар – близнецов меньших n.

10. Даны натуральные числа a, b (a<=b). Получить все пары чисел–близнецов больших a и меньших b.

11. Исследовать плотность вхождения пар - близнецов в первом миллионе, подсчитывая по тысячам, десяткам тысяч, сотням тысяч. Сделать вывод.

Олимпиадные задания

1. Сосчитать количество единиц в двоичной записи числа N.

2. Вводится N. Необходимо найти, на сколько нулей оканчивается N!=1*2*3*...*N.

3. Число вводится своим двоичным представлением (длина числа не превышает 10000 двоичных разрядов). Необходимо определить делится ли число на 15.

4. Задано натуральное число N, содержащее до 100 цифр. Делится ли данное число на

a) 3

b) 6

c) 7

d) 9

e) 11

f) 12.