c++ 梅森數(shù)源碼示例解析
題目:
要求:按從小到大的順序輸出所有不超過(guò)2……n−1的梅森數(shù),每行一個(gè)。如果完全沒(méi)有,則輸出“None”。
別人的例子
#include <math.h>
int main() {
int n = 0, m = 0, e = 0,h=0;
int i = 0;
scanf("%d", &n);
int a = (int)pow(2, n) - 1;//最大數(shù)
for (i = 2; i < a; i++) {//數(shù)字挨個(gè)增加
m = 0;
for (e = 2; e <= sqrt(i); e++) {//判斷是不是為素?cái)?shù)
if (i % e == 0) {
m++;
break;
}
}
if (m == 0) {
for (e = 1; e < n; e++) {
if (2.0 == pow(i + 1, 1.0 / (1.0 * e))) {//判斷是否滿(mǎn)足另一個(gè)條件
printf("%d\n", i);
h++;
break;
}
}
}
}
if (h == 0) {
printf("None");
}
return 0;
}
發(fā)現(xiàn)報(bào)錯(cuò): 分析錯(cuò)誤: 我感覺(jué)可能是求梅森數(shù)的思路不對(duì)。
1.for循環(huán)里的i是否需要在循環(huán)外聲明。
2.判斷i是否為素?cái)?shù)的方式可以改為使用線(xiàn)性篩法。
3.在判斷梅森數(shù)時(shí),使用pow函數(shù)求2的冪次方會(huì)影響精度,建議使用位運(yùn)算進(jìn)行優(yōu)化。
4.如果完全沒(méi)有梅森數(shù),應(yīng)該在循環(huán)外輸出“None”。
我的代碼
#include <stdio.h>
#include <math.h>
int main() {
int n = 0, p = 0, flag = 0;
scanf("%d", &n);
for (p = 2; p <n; p++) {
int i = 2, m = 2; //m為當(dāng)前計(jì)算出的2^p-1的值
//線(xiàn)性篩法求2^p-1是否為素?cái)?shù)
while (i <= sqrt(m)) {
if (m % i == 0) {
break; //不是素?cái)?shù),跳出循環(huán)
}
i++;
}
//如果i>sqrt(m)說(shuō)明m是素?cái)?shù)
if (i > sqrt(m)) {
printf("%d\n", m);
flag = 1; //標(biāo)記是否有梅森數(shù)
}
m = (m << 1) + 1; //計(jì)算下一個(gè)2^p-1的值
}
if (!flag) {
printf("None");
}
return 0;
}
顯示部分正確修改過(guò)的代碼
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
bool flag = false; // 記錄是否有梅森數(shù)
for (int i = 2; i < n; i++)
{
bool isPrime = true; // 記錄i是否為素?cái)?shù)
for (int j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
isPrime = false;
break;
}
}
if (isPrime) // 如果i為素?cái)?shù)
{
int m = i; // 記錄i的值
int sum = 0; // 記錄i的位數(shù)和
while (m > 0)
{
sum += m % 10;
m /= 10;
}
if (sum == i) // 如果i的位數(shù)和等于i本身,則為梅森數(shù)
{
cout << i << endl;
flag = true; // 有梅森數(shù)
}
}
}
if (!flag) // 如果沒(méi)有梅森數(shù)
{
cout << "None" << endl;
}
return 0;
}以上就是c++ 梅森數(shù)源碼示例解析的詳細(xì)內(nèi)容,更多關(guān)于c++ 梅森數(shù)源的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++消息隊(duì)列(定義,結(jié)構(gòu),如何創(chuàng)建,發(fā)送與接收)
這篇文章主要介紹了C++消息隊(duì)列(定義,結(jié)構(gòu),如何創(chuàng)建,發(fā)送與接收),消息隊(duì)列是一種先進(jìn)先出的隊(duì)列型數(shù)據(jù)結(jié)構(gòu),實(shí)際上是系統(tǒng)內(nèi)核中的一個(gè)內(nèi)部鏈表2022-08-08
C++簡(jiǎn)單實(shí)現(xiàn)的全排列算法示例
這篇文章主要介紹了C++簡(jiǎn)單實(shí)現(xiàn)的全排列算法,結(jié)合實(shí)例形式分析了C++排序操作的實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07
基于OpenCV?差分法實(shí)現(xiàn)綠葉識(shí)別
物體識(shí)別是圖像處理學(xué)在現(xiàn)實(shí)生活中較多的應(yīng)用之一,本文提供了一種相對(duì)簡(jiǎn)單的思路來(lái)實(shí)現(xiàn)綠葉識(shí)別,適合初學(xué)圖像處理的新人研究參考。感興趣的同學(xué)可以關(guān)注一下2021-11-11
利用C++實(shí)現(xiàn)矩陣的相加/相稱(chēng)/轉(zhuǎn)置/求鞍點(diǎn)
利用C++實(shí)現(xiàn)矩陣的相加/相稱(chēng)/轉(zhuǎn)置/求鞍點(diǎn)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢
這篇文章主要為大家詳細(xì)介紹了cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
C++ 中封裝的含義和簡(jiǎn)單實(shí)現(xiàn)方式
這篇文章主要介紹了C++ 中封裝的含義和簡(jiǎn)單實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04

