Здравствуйте.
Помогите, пожалуйста, с решением второй и четвёртой задачи на C. Можно просто словесный алгоритм решения.
Заранее, спасибо!
Нажмите для просмотра прикрепленного файла
uses crt;
function Prost(n:longint):boolean;{определение простого числа}
var i:longint;
begin
Prost:=true;
for i:=2 to round(sqrt(n))do{от двух до корня из числа}
if n mod i=0 then{если на что-то делится}
begin
Prost:=false;{не простое}
break;{дальше не проверяем}
end;
end;
function Hemming(n:longint):boolean;{определение Хемминга}
var i:longint;
begin
Hemming:=true;
for i:=7 to n div 2 do{от 7(меньше допустимо)до середины числа}
if Prost(i)and not(i in [2,3,5]) and(n mod i=0) then{если простое и на него можно делить}
begin
Hemming:=false;{не Хемминг}
break;{дальше не ищем}
end;
end;
var n,a,k:integer;
begin
clrscr;
write('n=');readln(n);
a:=1;k:=1;
while k<=n do
begin
inc(a);
{если число делится на 2,3,5 и больше ни на одно простое}
if ((a mod 2=0)or(a mod 3=0)or(a mod 5=0)) and Hemming(a) then
begin
inc(k);{считаем}
write(a,' ');{это просто для проверки, можно убрать}
end;
end;
writeln;
write('Hemming(',n,')=',a);
readln
end.
#include <iostream>Вводим 1025 - программа справедливо показывает, что следующее число Хэмминга = 1080.
bool is_hemming(int n)
{
int divs[3] = {2, 3, 5};
for(int i = 0; n != 1 && i < 3; i++) // цикл закончится когда i = 3, или n = 1
{
while(!(n % divs[i])) // Пока остаток от деления = 0
{
n = n / divs[i];
}
}
return (n == 1); // если частное = 1, значит нашли "5-гладкое" число...
}
int main()
{
int i, n, index = 0;
std::cin >> n;
for(i = 2; ; i++)
{
if(is_hemming(i))
{
index += 1;
if (i > n) break;
}
}
std::cout << "Hamming(" << index << ") = " << i << std::endl;
return 0;
}