zoukankan      html  css  js  c++  java
  • 素数链

    素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。

    【算法分析】

    非常明显,这是一道回溯的题目。从1开始,每个空位有20种可能,只要填进去的数合法:与前面的数不相同(判重);与左边相邻的数的和是一个素数。第20个数还要判断和第1个数的和是否素数。

    【算法流程】

    1、数据初始化;   2、递归填数:判断第J种可能是否合法;

    A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个;

    B、如果不合法:选择下一种可能;

    【参考程序】

     1 program ex5_1;框架[一]
     2 var  a:array[0..20]of integer;
     3         b:array[0..20]of boolean;  
     4         total:longint;
     5 function pd(x,y:integer):boolean;    //判断素数
     6 var   k,i:integer;
     7 begin
     8    k:=2; 
     9    i:=x+y; 
    10    pd:=false;
    11    while (k<=trunc(sqrt(i)))and(i mod k<>0) do inc(k);
    12    if k>trunc(sqrt(i)) then pd:=true;
    13 end;
    14 procedure print;                                        //输出方案
    15 var j:integer;
    16 begin
    17    inc(total);
    18    write('<',total,'>:');
    19    for j:=1 to 20 do write(a[j],' ');
    20    writeln;
    21 end;
    22 procedure Search(t:integer);                  //回溯过程
    23 var i:integer;
    24 begin
    25    for i:=1 to 20 do                                    //有20个数可选
    26     if pd(a[t-1],i)and b[i] then                    //判断与前一个数是否构成素数及该数是否可用
    27       begin
    28         a[t]:=i;   b[i]:=false;
    29         if t=20 then begin if pd(a[20],a[1]) then print;end
    30           else Search(t+1);
    31         b[i]:=true;
    32      end;
    33 end;
    34 BEGIN
    35   fillchar(b,sizeof(b),#1);                         //b数组赋初值为True
    36   total:=0;
    37   Search(1);write('total:',total);               //输出总方案数
    38 END.

    39 框架二: 40 var a:array[0..20]of integer; b:array[0..20]of boolean; total:longint; s:set of 1..40; 41 procedure print; //输出方案 42 var j:integer; 43 begin 44 inc(total); write('<',total,'>:'); 45 for j:=1 to 20 do write(a[j],' '); writeln; 46 end; 47 procedure Search(t:integer); //回溯过程 48 var i:integer; 49 begin 50 if t>20 then begin //如果20个数选用完则回溯 51 if (a[20]+a[1])in s then print; //如果满足条件,则输出 52 exit; 53 end; 54 for i:=1 to 20 do //有20个数可选 55 if ((a[t-1]+i) in s) and b[i] then //判断与前一个数是否构成素数及该数是否可用 56 begin 57 a[t]:=i; b[i]:=false; 58 Search(t+1); 59 b[i]:=true; 60 end; 61 end; 62 BEGIN 63 fillchar(b,sizeof(b),#1); //b数组赋初值为True 64 total:=0; s:=[1,2,3,5,7,11,13,17,19,23,29,31,37]; 65 Search(1);write('total:',total); //输出总方案数 66 END.

    素数链

    设计程序将1...n(20)排成一排,使任意两个相邻的数的和为素数。第1个和最后一个的和也为素数.

    输出:第一个数为1.

    如:

    样例输入:

    6

    样例输出:

    1 4 3 2 5 6

     1 主程序
     2 b[1..maxn]:记录结果序列。
     3 Visited[1..maxn]: 标记是否已用过
     4 fillchar(visited,sizeof(visited),0);
     5       b[1]:=1;
     6       visited[1]:=1;
     7       dfs(1,1);
     8 搜索过程
     9 procedure dfs(i,k:integer); //已找到第k个数是i,找第k+110   var j:integer;
    11     begin
    12       if (n=k)and(check(b[1]+b[k])) then print(1);
    13       for j:=1 to n do
    14         if (visited[j]=0) and (check(i+j)) then
    15           begin
    16             visited[j]:=1;
    17             b[k+1]:=j;
    18             dfs(j,k+1);
    19             visited[j]:=0;
    20           end;
    21     end;
    22 判读素数
    23 function check(i:integer):boolean;
    24     var j:integer;
    25     begin
    26         for j:=2 to i-1 do
    27            if  i mod j=0 then   exit(false);
    28         exit(true);
    29     end;
    30 优化:建立素数表
    31 maxn
    32 Prime[3..2*maxn-1]: boolean
    33 素数:true;非素数:false
    34 筛选法建立素数表
    35 筛选法求素数
    36 for i:=1 to n do prime[i]:=true;
    37     prime[1]:=false;
    38     for i:=2 to trunc(sqrt(n)) do
    39        if prime[i] then
    40           begin
    41               j:=2*i;
    42               while j<=n do
    43                   begin  prime[j]:=false; j:=j+i; end;
    44           end;
  • 相关阅读:
    Centos 安装字体库 以及解决confluence 旧文档数据的乱码
    设置Linux自启服务以及优先级
    Centos7下设置MySql自动启动
    Linux配置tomcat开机自启
    Linux安装JDK、tomcat
    CentOS7下安装mysql5.1 或升级到5.7 以及小问题的解决方案
    安装虚拟机,镜像文件下载链接
    1.键盘消失,阻止键盘弹出
    5. react父子组件
    CSS- 一些少用的
  • 原文地址:https://www.cnblogs.com/vacation/p/4856232.html
Copyright © 2011-2022 走看看