| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 334 人关注过本帖
标题:写了一个打印出几位数的回文质数的程序,没法运行,想问一下怎么回事?
只看楼主 加入收藏
青蝶
Rank: 2
等 级:论坛游民
帖 子:147
专家分:51
注 册:2018-2-4
结帖率:93.18%
  已结贴   问题点数:20  回复次数:4   
写了一个打印出几位数的回文质数的程序,没法运行,想问一下怎么回事?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

int is_Prime(int x){                     //判断一个数是不是质数
    int t,i;
    if(x==0 || x==1) return 0;
    if(x==2 || x==3) return 1;
    t=sqrt(x);
    for(i=2;i<=t;i++){
        if(x%i==0) return 0;
    }
    return 1;
}

int exponential(int x,int y){       //计算幂的函数
    int i,s=1;
    for(i=1;i<=y;i++){
      s=s*x;
    }
    return s;
}

void dfs(int l,int len,int step,int sum){       //len表示总共需要尝试的数位个数,step表示现在准备尝试第几个数位
    int i;
    if(step==len+1){                          //回文数已经放好了,验证是不是质数
        if(is_Prime(sum)){
            printf("%d\n",sum);
            return;
        }
    }
    if(step==1){                           //放置首位和末位的数字,不为0,且末位必须是奇数
      for(i=1;i<=9;i+=2){
          dfs(l,len,step+1,sum+i*exponential(10,l-step)+exponential(10,step-1));
    }
}
    else if(step==len){             //放置最中间的数位
        for(i=0;i<=9;i++){
                dfs(l,len,step+1,i*exponential(10,l-step));
            }
        }
    else{                      //放置一般的数位
        for(i=0;i<=9;i++){
            dfs(l,len,step+1,sum+i*exponential(10,l-step)+exponential(10,step-1));
        }
    }
}


void f(int l){                                //l代表几位数
    int i;
    if(l==1){
        if(is_Prime(2)) printf("2\n");
        if(is_Prime(3)) printf("3\n");
        if(is_Prime(5)) printf("5\n");
        if(is_Prime(7)) printf("7\n");
        return;
    }
    else if(l==2){                           //位数为2是,回文质数只有11
        if(is_Prime(11)) printf("11\n");
        return;
    }
    else if(l%2==0 && l!=2) return;    //位数是偶数且不为2时,不存在回文质数   
    dfs(l,(l+1)/2,1,0);                //位数是奇数且不为1时,调用dfs函数来计算
}

int main(void){
  f(3);
  return 0;
}
            
无法运行,求帮忙看一下怎么回事?
            
2018-07-09 20:35
no1xijin
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:江西
等 级:版主
威 望:19
帖 子:190
专家分:1126
注 册:2015-7-8
  得分:20 
void dfs(int l,int len,int step,int sum){       //len表示总共需要尝试的数位个数,step表示现在准备尝试第几个数位

这个函数的结束条件设置不正确,程序一直在调用自身,导致内存溢出了。
2018-07-10 17:10
青蝶
Rank: 2
等 级:论坛游民
帖 子:147
专家分:51
注 册:2018-2-4
  得分:0 
回复 2楼 no1xijin
if(step==len+1){                          //回文数已经放好了,验证是不是质数
        if(is_Prime(sum)){
            printf("%d\n",sum);
            return;
        }
}

这一段是递归的边界,是这一段不正确么?我看不出来哪儿不对,大佬能帮一下么?
2018-07-10 19:10
no1xijin
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:江西
等 级:版主
威 望:19
帖 子:190
专家分:1126
注 册:2015-7-8
  得分:0 
我是拿你的程序测试,发现它一直在里面运行,根本结束不了。
你可以在
if(step==len+1){  
这一行的前面加一个
printf("测试1\n");
自己看
2018-07-10 19:17
青蝶
Rank: 2
等 级:论坛游民
帖 子:147
专家分:51
注 册:2018-2-4
  得分:0 
改好了,谢谢大佬~
2018-07-11 12:19







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.052004 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved