Консультация № 144839
24.09.2008, 07:27
0.00 руб.
24.09.2008, 07:29
0 3 3
Здравствуйте уважаемые эксперты. Помогите решить задачку.
Дано натуральное число n. Найти все числа Мерсена меньше n. Числом Марсена называется число которое можно представить в виде 2 p -1, где p -тоже простое число.
Например: 31=2 5 -1

Приложение:
Решить данную задачу с применением функций

Обсуждение

Неизвестный
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;
}
Неизвестный
24.09.2008, 10:46
общий
это ответ
Здравствуйте, Попов Александр Олегович!

я не совсем понял какие именно числа Марсена нужны. с натуральными показателями (смутило слово "тоже") или все таки с простыми.
сделал оба варианта:

(функция вынесена в класс, для генерации простых чисел.)

Компилировалось на MS VC++ 2003, если компилятор у вас другой убедитесь, что тип unsigned long long 64-битный.



Приложение:
#include <vector>
#include <iostream>

typedef unsigned long ulong;

class SimpleNumGenerator
{
public:
SimpleNumGenerator() : cur_(0) {
lastNums_.reserve(1024);
lastNums_.push_back(1);
}

// находит и возвращает следующее простое число
ulong getNext(){
if(cur_ == 0){
cur_ = 1;
return 2;
}
test_next:
cur_ += 2;
Nunms::const_iterator it = lastNums_.begin() + 1;
for(; it != lastNums_.end() && *it * *it <= cur_; ++it)
if(cur_ % *it == 0)
goto test_next;
ulong d = lastNums_.back() + 2;
for(; d * d <= cur_; d += 2)
if(cur_ % d == 0)
goto test_next;
lastNums_.push_back(cur_);
return cur_;
}

private:
ulong cur_;

typedef std::vector<ulong> Nunms;
Nunms lastNums_;
};

int main(int argc, char* argv[])
{
SimpleNumGenerator sn;

const unsigned long long N = -1; //2305843009213693952;

for(;;){
unsigned power = sn.getNext();
if(power > 63)
break;
unsigned long long powered = (unsigned long long)1 << power;
if(powered > N)
break;
std::cout << "power = " << power << " Mersenne = " << powered - 1 << "\n";
}

std::cout << std::endl;

for(unsigned power = 1; power < 64; ++power){
unsigned long long powered = (unsigned long long)1 << power;
if(powered > N)
break;
std::cout << "power = " << power << " Mersenne = " << powered - 1 << "\n";
}

return 0;
}
Неизвестный
24.09.2008, 23:14
общий
это ответ
Здравствуйте, Попов Александр Олегович!
Числа Марсена вычисляются в ф-ии marsen_print(). Она же выводит их на экран. Числа вычисляются с помощью функции pow(x,y) (x^y), определенной в <math.h>


Приложение:
#include <iostream>
//Используется для вычисления степени pow()
#include <math.h>

//Определяет стандартное пространство имен
using namespace std;

//Объявление функции, вычисляющей числа Марсена и выводящей их на экран
void marsen_print(float);

int main()
{
float n; //вводимое число

cout<<"BBEDuTE 4IICJIO: ";
cin>>n;

cout<<"\n";

marsen_print(n);

return 0;
}
//Определение функции
void marsen_print(float n)
{
float marsen; //число Марсена
for (float p=0;;p++){
//Вычисление числа Марсена
marsen=pow(2,p)-1;
//Если оно меньше n, то печать
if(marsen<n) cout<<marsen<<" ";
//Если меньше, то выход из цикла
else break;
}
}
Форма ответа