Доброго времени суток, хабражители. Я хотел бы рассказать об алгоритме, который был применён мной для вычисления чисел Мерсена, а также о реализации этого алгоритма на С++. И так, поехали!
Как-то раз, прочитав о простых числах Мерсена, я захотел вычислить хотя-бы одно такое большое число. Проблема заключалась в том, что ни один тип данных языка С++ не обладает нужным диапазоном. И вдруг одним февральским днём на меня снизошло озарение. А что, если число разбить по разрядам и записать в массив? Вспомнив начальные классы (точнее, правила умножения столбиком), и проанализировав тип int>, я пришёл к выводу, что оптимальным вариантом будет разбиение числа по 4 разряда и запись его в int-овый массив. При этом, если в ячейке получается число, большее 9999, то отделяем старший разряд и записываем его в следующую ячейку. Ура, человеческий алгоритм есть! Приступаем к написанию кода.
Если вы посмотрели код, то, наверное, заметили, что он ещё далёк от совершенства.
1. Я не могу предсказать, насколько большое число ищет пользователь, поэтому зарезервировал 10000000 ячеек массива.
2. Число не помещается в консоль, поэтому нужно реализовать вывод в файл (работаю над этим).
Алгоритм работает (было проверено на первых 50 числах). Буду рад выслушать предложения по улучшению кода.
Сказ о том, как мы Алгоритм искали
Как-то раз, прочитав о простых числах Мерсена, я захотел вычислить хотя-бы одно такое большое число. Проблема заключалась в том, что ни один тип данных языка С++ не обладает нужным диапазоном. И вдруг одним февральским днём на меня снизошло озарение. А что, если число разбить по разрядам и записать в массив? Вспомнив начальные классы (точнее, правила умножения столбиком), и проанализировав тип int>, я пришёл к выводу, что оптимальным вариантом будет разбиение числа по 4 разряда и запись его в int-овый массив. При этом, если в ячейке получается число, большее 9999, то отделяем старший разряд и записываем его в следующую ячейку. Ура, человеческий алгоритм есть! Приступаем к написанию кода.
О коде
Вот, собственно, сам код
//---------------------------------------------------------------------------
#include<iostream>
#include<locale>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
#define MySize 10000000
int main() {
setlocale(LC_ALL, "RU");
int *stepen = new int[MySize];
// int *rezult = new int[MySize];
// int c=0;
int b=1;
memset(stepen,0, MySize*sizeof(int));
stepen[0]=2;
int a;
cin >> a;
for (int i=1; i<a; i++) {
for(int k=b-1;k>=0;k--){
stepen[k]*=2;
if (stepen[k] / 10000>=1) {
stepen[k+1] += stepen[k]/10000;
stepen[k] %= 10000;
if(k == b-1) b++;
}
}
}
stepen[0]--;
for (int i=b-1; i>=0; i--) cout << stepen[i];
cout << '\n';
system("PAUSE");
return (0); }
Если вы посмотрели код, то, наверное, заметили, что он ещё далёк от совершенства.
1. Я не могу предсказать, насколько большое число ищет пользователь, поэтому зарезервировал 10000000 ячеек массива.
2. Число не помещается в консоль, поэтому нужно реализовать вывод в файл (работаю над этим).
Алгоритм работает (было проверено на первых 50 числах). Буду рад выслушать предложения по улучшению кода.