环序列

// 回溯求解n项素数和环,c551
#include<stdio.h>
#include<math.h>
void main()
{ int t,i,j,n,k,s,a[2000],b[1000];
  printf("   前n个正整数组成素数和环,请输入整数n: "); 
  scanf("%d",&n);  
  for(k=1;k<=2*n;k++) b[k]=0;
  for(k=3;k<=2*n;k+=2)
     {for(t=0,j=3;j<=sqrt(k);j+=2)
         if(k%j==0)
            {t=1;break;}
         if(t==0) b[k]=1;            // 奇数k为素数的标记  
         }
  printf("   前%d个正整数组成素数和环,其中5个为:\n",n); 
  a[1]=1;s=0;
  i=2;a[i]=2; 
  while(1)
   {t=1;
    for(j=1;j<i;j++)
      if(a[j]==a[i] || b[a[i]+a[i-1]]!=1) // 出现相同元素或非素时返回   
{t=0;break;}
    if(t && i==n && b[a[n]+1]==1)
      { s++;
           printf("  %d: 1",s);
       for(j=2;j<=n;j++) printf(",%d",a[j]);
       printf("\n");  
           if(s==5) return;
      }
if(t && i<n) 
{i++;a[i]=2;continue;}
    while(a[i]==n && i>1) i--;        // 实施回溯  
    if(i>1) a[i]++;
    else break;
   }
 }
 



// n阶德布鲁金环序列回溯设计,c552
#include <stdio.h>
#include <math.h>
void main()
{??int d,i,h,k,j,m,m1,m2,n,s,t,x,a[200];
  printf("请输入(2<n)n: "); scanf("%d",&n);
  m=1;
  for(k=1;k<=n;k++)  m=m*2;           // 计算m=2^n
  s=0;
  for(k=0;k<=m+n;k++) a[k]=0;
  a[n]=1;a[m-1]=1;
  i=n+1;
  while(1)
    {if(i==m-2)
       {for(h=0,j=n+1;j<=m-2;j++)
           if(a[j]==0) h++;
        if(h==m/2-n)                // 判别是否有m/2-n个零  
          {for(t=0,k=0;k<=m-2;k++)
           for(j=k+1;j<=m-1;j++)
               {d=1;m1=0;m2=0;    
  // 检验是否有相同的由n相连数字组成的二进制数  
               for(x=n-1;x>=0;x--)
                {m1=m1+a[k+x]*d; m2=m2+a[j+x]*d;d=d*2;}
               if(m1==m2) {t=1;break;}
               }
           if(t==0)
             {s++;
              if(n<=4 || (n>4 && s<=3))
                 {printf("NO(%5d): ",s);
                  for(j=0;j<=m-1;j++)
                     printf("%d",a[j]);
                  printf("\n");
                 }
              }
           }
         }
     if(i<m-1)
        {i++;a[i]=0;continue;}
     while(a[i]==1 && i>n+1) i--;          // 向前回溯  
     if(a[i]==1 && i==n+1) break;
       else a[i]=1;
    }
 }

 

转载于:https://www.cnblogs.com/liao-pxsoftware15/p/8013065.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值