24.09.2008, 10:06
общий
это ответ
Здравствуйте, Попов Александр Олегович!
Код С++ программы в приложении.
Приложение:
//Подключаем заголовок потокового ввода/вывода
#include <iostream>
//Подключаем заголовок для обеспечения работы с мат. функциями
#include <cmath>
using namespace std;
//Объявляем прототип функции для проверки на принадлежность к числу Мерсенна
bool IsMersennValue(int p);
//Объявляем прототип функции для проверки на простое число
bool IsSimple(int value);
int main ()
{
setlocale(LC_CTYPE, "Russian");
int a, //Верхняя граница в дипазоне поиска
b = 0, //Наше совершенное число
p = 1; //Степень для проверки на принадлежность к числу Мерсенна
cout << "Введите верхнюю границу диапазона: ";
cin >> a;
int temp = 1;
//В данном цикле находим макс. степень p, такую что 2 ^ (p - 1) * (2 ^ p - 1) не превышает a
while(true)
{
temp = pow(2.0, p - 1) * (pow(2.0, p) - 1);
if(temp >= a)
{
p--;
break;
}
p++;
}
//Теперь находим наше совершенное число
for(temp = 2; temp <= p; temp++)
{
if(IsMersennValue(temp)) //Если true, то temp - степень, которая "определяет" число Мерсенна
{
b = pow(2.0, temp - 1) * (pow(2.0, temp) - 1);
cout << b << endl;
}
}
return 0;
}
//Описание работы функции для проверки на простое число
bool IsSimple(int value)
{
if(value == 1 || value == 2)
return true;
for(int i = 2; i < value; i++)
if(value % i == 0)
return false;
return true;
}
//p - простое число; если 2 ^ p - 1 тоже простое, то данное число есть числом Мерсенна
bool IsMersennValue(int p)
{
int temp = pow(2.0, p) - 1;
if(IsSimple(temp))
return true;
return false;
}