回 帖 发 新 帖 刷新版面

主题:求助C语言大神

将1~20的自然数围成一圈,使其相邻的两数之和均为素数。


求C程序代码啊

回复列表 (共7个回复)

沙发

1、找出不大于20*2的所有质数;
2、加法分解这些质数;
3、将结果排到数组中。
完。

板凳

[code=c]
#include <stdio.h>
#include <string.h>
#include <conio.h>

#define M 25 
#define N 21

static int Prime_NUM[M] = 
{
    3, 5, 7, 11, 13, 17, 
    19, 23, 29, 31, 37
};
 
int  Neib_Sum_Prime(int ar[N]);
int  Is_Prime(int num1, int num2);

int main(int argc, char *argv[])
{
    int ar[N], ct;
    ct = 0;
    memset(ar, 0, sizeof(ar));
    ct = Neib_Sum_Prime(ar);
    printf("解数为:%d\n",ct);
    return 0;
}

int Neib_Sum_Prime(int ar[N])
{
    int i, j, flag, ct;
    
    ct = 0;
    i  = 1; ar[i] = 1;
    
    while(1)
    {
        flag = 1;
        for(j = 1; j < i; j++)
        {
            if(ar[j] == ar[i] || !Is_Prime(ar[i], ar[i-1]))
            {
                flag = 0;
                break;
            }
        }
        if(flag == 1 && i == N - 1 && Is_Prime(ar[N-1], ar[1]))
        {
            for(j = 1; j <= N - 1; j++)
            {
                printf("%d  ", ar[j]);
            }
            putchar('\n');
            //getch();
            ct++;
        }        
        
        if(flag == 1 && i < N - 1)
        {
            i++;
            ar[i] = 1;
            continue;
        }
        
        while(ar[i] == N - 1 && i > 1)
        {
            i--;
        }
        
        if(i == 1)
        {
            break;
        }
        else
        {
            ar[i]++;
        }
    }
    return ct;
}

int Is_Prime(int num1, int num2)
{
    int sum, index;
    sum = num1 + num2;
    for(index = 0; index < M; index++)
    {
        if(sum == Prime_NUM[index])
        {
            return 1;
        }
    }
    return 0;
}
[/code]
解数为:6309300。 跑了这么久才跑出来。

3 楼

楼上的,就算用穷举看有多少种也不用这样啊,顺时针排如果是正解,那逆时针也是正解。
序列a1...a20如果是正解,那么a2...a20,a1也是正解,以此类推相似的有20组正解,再加上反转的一套就代表有40组:)

4 楼

确实没有考虑顺时针逆时针的情况,不过这个程序重复的解应该是2,而不是20.可能我想错了,请指正下。。

5 楼

因為是個環,所以:
以a1為開頭如果有其中一個結果為:
a1...a20
那么,必然會有:
a2...a20,a1
a3...a20,a1,a2
a4...a20,a1...a3
a5...a20,a1...a4
....
a20,a1...a19
共20组相同的解。

也就是說:其实你只需要求出a[1]=1的所有情况,其他的必然是重的:)

接下来,我们考虑两数相加结果为素数的情况,其中两个不同的正数相加最小为3,而大于或等于3的素数全都是奇数。
奇数必然是:奇数+偶数,这样一个状态。
所以a[i]++完全可以变为a[i]+=2;只不过在初始化时要记得一奇一偶的初始化:)

至于反转的情况,按您现在的算法来说确实不好判断。那就这样吧:)

6 楼

[em9][em9]不错!!多谢指点。。虽然对这t没什么兴趣了,但还得抽个时间改下。。

7 楼

希望能哟所帮助哈

我来回复

您尚未登录,请登录后再回复。点此登录或注册