注册 登录
编程论坛 C++教室

关于递归的比较恶的题目,特来求教!有兴趣的可以来看看!谢谢

qkhhwfnh861 发布于 2009-07-17 23:51, 1005 次点击
不说废话了我,附上程序代码!
题目将从1到n(为偶数)这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。
 *输入n输出它所有的素数环。
 *如:
 *输出20的一个素数环:
 *1  2  3  4  7  6  5  8  9  10  13  16  15  14  17  20  11  12  19  18

#include<iostream>
#include<cmath>
using namespace std;
int data[222]={0};
int used[111]={0};
int flag[111];
bool isok=false;
bool check(int n)
{
    int i,flag;
    if(n==2)
      return true;
  else
  {
      for(i=2;i<=sqrt(n);i++)
      {
          flag=0;
          if(n%2==0)
          {
              flag=1;
              break;
          }
      }
      if(flag==0)

          return true;
      else
          return false;
  }
}

void huan(int *data,int k,int n)
{
   if(isok)
       return ;
    int i;
   for(i=1;i<=n;i++)
   {
       if(k==1)
       {
            data[k]=i;
            used[i]=1;
            huan(data,k+1,n);
       }
       else
           if(k==n)
       {
          if((used[i]==0)&&check(i+data[k-1])&&check(i+data[1]))
          {
              used[i]=1;
              data[k]=i;
              for(int j=1;j<=n;j++)
                    cout<<data[j]<<" ";
                    cout<<endl;
                    isok=true;
                    return ;
          }
       }
     else
     {
          if(used[i]==0&&check(i+data[k-1]))
         {
            used[i]=1;
            data[k]=i;
            huan(data,k+1,n);
         }
     }
   }
}
void main()
{
    int n,i;
   cout<<"请输入你要的数字(必须要是偶数):";
   cin>>n;
   while(n%2!=0)
   {
       cout<<"请重新输入:";
       cin>>n;
   }
   for(i=1;i<=n;i++)
        flag[i]=i;
    huan(data,1,n);
}
自认为写的代码没什么问题,不知道为什么运行不出结果来!改怎么改!求助各位大侠!学了一学期C++,还望指点……
10 回复
#2
qkhhwfnh8612009-07-17 23:57
呵呵
希望高手们帮我看看,我自己调试一天半、   走了遍程序没发现错误!
#3
小鱼874266282009-07-18 00:15
在换函数里面,明显下面这个程序表示是错误的。
for(i=1;i<=n;i++)
   {
       if(k==1)
       {
            data[k]=i;
            used[i]=1;
            huan(data,k+1,n);
       }
       else 。。。
当k=1时,整个程序就会进入死循环,一直都进入if(k==1)的逻辑,当然就无效应,打不出任何东西来了啦
#4
qkhhwfnh8612009-07-18 00:36
回复 3楼 小鱼87426628
怎么会呢??!!恕我愚钝!当K==1时 执行下面语句 里面有一个huan(data,k+1,n)  此时K=2 不满足k==1 这种情况了啊!就不会循环这语句了啊   那如果是你该怎么改???!!
#5
wxjeacen2009-07-18 08:07
这个是递归回溯,我写了个给你。可以check.

你还没理解递归回溯的本质。

[[it] 本帖最后由 wxjeacen 于 2009-7-18 08:08 编辑 [/it]]
#6
tjp19842009-07-18 16:55
就没有用到i,check函数是错误的
for(i=2;i<=sqrt(n);i++)
      {
          flag=0;
          if(n%i==0)
          {
              flag=1;
              break;
          }
      }

[[it] 本帖最后由 tjp1984 于 2009-7-18 17:02 编辑 [/it]]
#7
wuyun85362009-07-18 21:42
我编译是成功的啊就是把sqrt(n)改为::sqrt(n)

请输入你要的数字(必须要是偶数):20

1 4 3 2 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20


Terminated with return code 0
Press any key to continue ...
#8
wuyun85362009-07-18 21:52
我用的mingw develop studio
#9
wuyun85362009-07-18 22:00
结果有问题,貌似check是否素数的 算法 有问题
#10
qkhhwfnh8612009-07-19 11:35
谢谢你们
不好意思昨天有事没来看!呵呵,原来是我函数的笔误写错了,我还一直以为是我的素数回溯出错误,这是我第一次发帖询问别人,还不知道怎么给分,嘿嘿……这个论坛不错,让我这初学者得到了一个求救的平台,谢谢你们!
#11
hfdss2009-07-19 20:01
呵呵,顶一下这个帖子。
1