到目前仅发现51个360问答梅森素数,最大的是M8258活呀款屋评委右只克扩9933(即2的8258英全汉概易神志溶持9933-1),有24862048位。
就如题主所述:我想用吧停技精迫列三作煤普通电脑,用特殊算几油杂汽法试试,但速度太慢了,不行,不凯吗见台存映超握还抗能实现。(特殊算法阿就是指,仅仅算一步除法,进行初步判断,比如:一般叶病移范人认为对于梅森数若指数p是4x+3型的奇数,指数p若是素数,且2p+1也是素数,则该梅森数可以被2令山煤创老p+1整除,若是不能整除呢?那就基本可以确定是素数了,这样的情况是很稀少的。比如99检素蛋热块368963是个素数,2*99368963=198737927也是素数,2^9936令发刚装送冲害电牛庆8963-1是否能被198737927整除呢?如果不能被整除,那就可能是素数,几乎是确定的。第51个梅森素县胶效新小杨越须数没有这个数大呢,如果这个数是素数就是第52个梅森素数。)
家用普通电脑创建这样一个数组是否满足需求_int64 a[100000]{},公共_int64 cf[10000000]{};
相信数值运算远比字符运算快得衡歼滚多得多多
这就是我的分治法,不同以往字符运算,与其在字符上绞尽脑汁改升,不如跳出字符,另寻新途。
vo电圆部指节张洲却解亚命id 二的次方数组(_i玉丰赶刘十哪远花她nt64* 数, int 长, _int64 次)
_int64 溢 = 0, 段 = 0, 乘数 = 0, 序 = 长 - 1, 模 = 1E+9, 次方 = 1;
数[序] = 1黄较两;
while (次顺曲标密眼元氢方)
if ((乘数 = 数[序]) > 0)
数[序] = (乘数 - 乘数 / 模*模) * 2 + 溢;
溢 = 数[序] / 模;
数[序] -= 溢*模;
段 = (乘数 / 模) * 2 + 溢;
溢 = 段 / 模肥立;
数[序] += (段 - 段 / 模*模)*模;
//cout << 数[序] << "\t" << 溢 << "\t:";
--序;
else
数[序] += 溢;
if (++次方 > 次 || 数[0] > 0)
while (序 < 长)
写入文本("..\\Debug\\回复专用\\二次方数据" + std::to_string(次咐余方) + ".txt", std::to_string(数[序++]) + "\n");
次方 = 0;
else;
if (次方 % 4000000 == 0)
写入文本("..\\Debug\\回复专用\\二次方数据" + std::to_string(次方) + ".txt", std::to_string(序) + "\n");
while (++序 < 长)
写入文本("..\\Debug\\回复专用\\二次方数据" + std::to_string(次方) + ".txt", std::to_string(数[序]) + "\n");
//次方 = 0;
else;
序 = 长 - 1; 溢 = 0;
//cout << 次方 << "\n";
_int64 a[900000]{}, al = 900000, x = 0, p = 0;
clock_t 开始 = clock();
二的次方数组(a, 100000, 99368963);
clock_t 结束 = clock();
while (x < al)if (a[x] || p)
std::cout << setw(18) << setfill('0') << a[x], ++x, ++p;
else ++x;
std::cout << "\t" << p << "\n";
void 写入文本(string 文件名, string 内容)
std::ofstream 文件(文件名, std::ios::app);
文件 << 内容;//第一条数据会少1位数,后面的就是18位数了.<< setw(18) << setfill('0')
void findfile(std::string path, std::string mode)
_finddata_t file;
intptr_t HANDLE;
std::string Onepath = path + mode;
HANDLE = _findfirst(Onepath.c_str(), &file);
if (HANDLE == -1L)std::cout << "无法匹配文件夹路径" << std::endl;
do {
if (file.attrib)
std::string newPath = path + ***.name;
std::cout << ***.name << " " << std::endl;
}//判断是否有子目录 & _A_SUBDIR
//if ((strcmp(***.name, ".") != 0) && (strcmp(***.name, "..") != 0))//判断是否为"."当前目录,".."上一层目录
// std::string newPath = path + "\\" + ***.name;
// findfile(newPath, mode);
//else
// std::cout << ***.name << " " << std::endl;
} while (_findnext(HANDLE, &file) == 0);
_findclose(HANDLE);
void findfile(std::string path, std::string mode, _int64* 数, int 长)
_finddata_t file;
intptr_t HANDLE = _findfirst((path + mode).c_str(), &file);
if (HANDLE == -1L)
std::cout << "无法匹配文件夹路径" << std::endl;
else;
do
if (file.attrib)
std::string newPath = path + ***.name;
else;
} while (_findnext(HANDLE, &file) == 0);
读取文本(path + ***.name, 数, 长);
_findclose(HANDLE);
std::string mode = "\\二次方数据*.txt";
std::string path = "..\\Debug\\回复专用";
findfile(path, mode);
梅森数(Mersenne number)是指形如2^p-1的正整数,其中指数p是素数,常记为Mp .若Mp是素数,则称为梅森素数(Mersenne prime).p=2,3,5,7时,Mp都是素数,但M11=2047=23×89不是素数
还没有评论,来说两句吧...