C++程序问题,新手。。求解

问题:如果一个素数可以写成2^p-1的形式,其中p是一个正整数,那么该素数就称为梅森素数。输入一个正整数n(0<=n<=31)输出p<=n的梅森素数的个数例如32#inc... 问题:如果一个素数可以写成2^p-1的形式,其中p是一个正整数,那么该素数就称为梅森素数。
输入一个正整数n(0<=n<=31)
输出p<=n的梅森素数的个数

例如

3

2

#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int n){
bool flag = true;
if (n <= 1)
flag = false;
else if (n == 2)
flag = true;
else if (n % 2 == 0)
flag = false;
else{
int limit = sqrt(n) + 1;
for (int i = 3; i <= limit; i += 2){
if (n%i == 0){
flag = false;
break;
}
}
}
return flag;

}
int main(){
int n, i = 0;
double p, q;
cin >> n;
if (n >= 0 && n <= 31){
while (n--){
while (isPrime(n)){
p = log(n + 1) / log(2);
q = ceil(p);
if (p - q == 0){
i++;
}

}
}
}
cout << i << endl;
return 0;
}

测试不出来,一改连编译都编不出来了。。跪求大神赐教。。不胜感激
展开
 我来答
yanjianming05
2014-03-21 · 超过33用户采纳过TA的回答
知道答主
回答量:121
采纳率:100%
帮助的人:26.8万
展开全部
#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int n){
bool flag = true;
if (n <= 1)
flag = false;
else if (n == 2)
flag = true;
else if (n % 2 == 0)
flag = false;
else{
int limit = sqrt(n) + 1;
for (int i = 3; i <= limit; i += 2){
if (n%i == 0){
flag = false;
break;
}
}
}
return flag;
}
bool is2cifang(int n) //是2的幂级数
{
while(n)
{
if(n%2==1)
{
return false;
}
n /=2;
if(n==1)
{
return true;
}
}
}
int main(){
int n, i = 0;
double p, q;
cin >> n;
if (n >= 0 && n <= 31){
n++; //否则下面的n--,31这个数就忽略掉了
while (n--){
if (isPrime(n)){
// p = log(n + 1) / log(2); 误差太大,n=7时就结果错误
// q = ceil(p);
// if (p - q == 0){
if(is2cifang(n+1)){
i++;
}

}
}
}
cout << i << endl;
return 0;
}
Cabbage518
2014-03-21 · 超过24用户采纳过TA的回答
知道答主
回答量:67
采纳率:0%
帮助的人:64.5万
展开全部
while (n){
if(isPrime(n)){
p = log(n + 1) / log(2);
q = ceil(p);
if (p - q == 0)
i++;
}
n--;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式