| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1005 人关注过本帖
标题:关于递归的比较恶的题目,特来求教!有兴趣的可以来看看!谢谢
只看楼主 加入收藏
qkhhwfnh861
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2009-7-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
关于递归的比较恶的题目,特来求教!有兴趣的可以来看看!谢谢
不说废话了我,附上程序代码!
题目将从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++,还望指点……
搜索更多相关主题的帖子: 递归 兴趣 
2009-07-17 23:51
qkhhwfnh861
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2009-7-17
收藏
得分:0 
呵呵
希望高手们帮我看看,我自己调试一天半、   走了遍程序没发现错误!
2009-07-17 23:57
小鱼87426628
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2008-5-17
收藏
得分:2 
在换函数里面,明显下面这个程序表示是错误的。
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)的逻辑,当然就无效应,打不出任何东西来了啦
2009-07-18 00:15
qkhhwfnh861
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2009-7-17
收藏
得分:0 
回复 3楼 小鱼87426628
怎么会呢??!!恕我愚钝!当K==1时 执行下面语句 里面有一个huan(data,k+1,n)  此时K=2 不满足k==1 这种情况了啊!就不会循环这语句了啊   那如果是你该怎么改???!!
2009-07-18 00:36
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:4 
这个是递归回溯,我写了个给你。可以check.

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

[[it] 本帖最后由 wxjeacen 于 2009-7-18 08:08 编辑 [/it]]

test_c++.tar.gz (51.65 KB)

生命不熄,战斗不止.
2009-07-18 08:07
tjp1984
Rank: 2
来 自:河南
等 级:论坛游民
帖 子:137
专家分:39
注 册:2009-5-13
收藏
得分:4 
就没有用到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]]

粗体文字 憨豆先生[/b]
2009-07-18 16:55
wuyun8536
Rank: 2
等 级:论坛游民
帖 子:21
专家分:77
注 册:2009-6-7
收藏
得分:4 
我编译是成功的啊就是把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 ...
2009-07-18 21:42
wuyun8536
Rank: 2
等 级:论坛游民
帖 子:21
专家分:77
注 册:2009-6-7
收藏
得分:3 
我用的mingw develop studio
2009-07-18 21:52
wuyun8536
Rank: 2
等 级:论坛游民
帖 子:21
专家分:77
注 册:2009-6-7
收藏
得分:3 
结果有问题,貌似check是否素数的 算法 有问题
2009-07-18 22:00
qkhhwfnh861
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2009-7-17
收藏
得分:0 
谢谢你们
不好意思昨天有事没来看!呵呵,原来是我函数的笔误写错了,我还一直以为是我的素数回溯出错误,这是我第一次发帖询问别人,还不知道怎么给分,嘿嘿……这个论坛不错,让我这初学者得到了一个求救的平台,谢谢你们!
2009-07-19 11:35
快速回复:关于递归的比较恶的题目,特来求教!有兴趣的可以来看看!谢谢
数据加载中...
 
   



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

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