素数环

来源:互联网 发布:北京建筑大学网络 编辑:程序博客网 时间:2024/05/16 10:05

题目描述

中文题目就不给大家写故事背景了。给你1~n这n(0<n<19)个整数,让你把他们放在一个环上,使环上相邻的两个数的和为素数。对于一个整数n一共有多种方式构成这种素数环,把一共有多少方式输出,每种方式都有1开头。
例如:
n等于的时候,把1~6放在一个环
上面这个环就满足要求,1+4=5,5为素数。4+3=7,7为素数……6+1=7,7为素数。
输入样例:
6
输出样例:
2
解释:当n等于6的时候一共有
1 4 3 2 5 6
1 6 5 2 3 4
上面这2种方式
 
输入样例:
8
输出样例:
4
解释:当n等于8的时候一共有
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
上面这4种方式构成素数环。





可以使用递归实现


#include <stdio.h>#include <math.h>#include <string.h>int len;int ans;int prime[12] = {2,3,5,7,11,13,17,19,23,29,31,37};int isprime[40];void primering(int ring[], int f[], int n){    if (n == len)    {        if (isprime[ring[n]+1] == 1)            ans++;        return;    }    int i;    for (i = 2; i <= len; ++i)    {        if (isprime[ring[n]+i] == 1 && f[i] == 0)        {            f[i] = 1;            ring[n+1] = i;            primering(ring, f, n+1);            f[i] = 0;        }    }    return;}int main(){    ans = 0;    scanf("%d", &len);    int i, j;    int f[30] = {0};    int ring[30];    if (len == 1 || len == 2)        ans = 1;    else if (len % 2 == 1)        ans = 0;    else    {        memset(isprime, 0, sizeof(isprime));        for (j = 0; j < 12; ++j)            isprime[prime[j]] = 1;        ring[1] = 1;        for (i = 2; i <= len; ++i)        {            if (isprime[i+1] == 1 && f[i] == 0)            {                f[i] = 1;                ring[2] = i;                primering(ring, f, 2);                f[i] = 0;            }        }    }    printf("%d\n", ans);    return 0;}


0 0
原创粉丝点击