主题:求助C语言大神
nese
[专家分:0] 发布于 2011-06-15 21:28:00
将1~20的自然数围成一圈,使其相邻的两数之和均为素数。
求C程序代码啊
回复列表 (共7个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-06-16 09:00:00
1、找出不大于20*2的所有质数;
2、加法分解这些质数;
3、将结果排到数组中。
完。
板凳
fragileeye [专家分:1990] 发布于 2011-06-16 16:19:00
[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 楼
cgl_lgs [专家分:21040] 发布于 2011-06-16 20:06:00
楼上的,就算用穷举看有多少种也不用这样啊,顺时针排如果是正解,那逆时针也是正解。
序列a1...a20如果是正解,那么a2...a20,a1也是正解,以此类推相似的有20组正解,再加上反转的一套就代表有40组:)
4 楼
fragileeye [专家分:1990] 发布于 2011-06-16 21:14:00
确实没有考虑顺时针逆时针的情况,不过这个程序重复的解应该是2,而不是20.可能我想错了,请指正下。。
5 楼
cgl_lgs [专家分:21040] 发布于 2011-06-17 00:18:00
因為是個環,所以:
以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 楼
fragileeye [专家分:1990] 发布于 2011-06-17 00:40:00
[em9][em9]不错!!多谢指点。。虽然对这t没什么兴趣了,但还得抽个时间改下。。
7 楼
aiguozhehao [专家分:0] 发布于 2011-06-19 07:28:00
希望能哟所帮助哈
我来回复