| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2188 人关注过本帖
标题:将1,2,3,4……20这20个自然数排成一个圈,使任意两个相邻的自热数之和均为素 ...
取消只看楼主 加入收藏
婷婷99
Rank: 1
等 级:新手上路
帖 子:48
专家分:7
注 册:2012-2-28
结帖率:25%
收藏
已结贴  问题点数:20 回复次数:7 
将1,2,3,4……20这20个自然数排成一个圈,使任意两个相邻的自热数之和均为素数。

希望读者可以耐心看完我的代码。
#include <stdio.h>
#include <math.h>
bool sushu(int m)//判断是否是素数
{
int i;
for(i = 2; i <= sqrt(m) ; i ++)
{
if(m % i == 0)
break;
else
continue;
}
if(i > sqrt(m))
return true;
else
return false;
}
void quan(int a[], int b[], int m, int j)//围圈
{
int i;
for(i = 1; i < m; i ++)
{
if(a[i] != b[j] && sushu(b[j] + a[i]) && a[i] != 0)
{
b[++ j] = a[i];//如果满足条件就将a[i]加到数组b中。
a[i] = 0; //同时将a[i]变成0
quan(a, b, m, j);//继续
}
}   
}
int main()
{
int a[20], b[20], i, j;
printf("*******初始化数组**********\n");
for(i = 0; i < 20; i ++)
a[i] = i + 1;
j = 0;
b[j] = a[0];//将b[0]初始化为a[0]
a[0] = 0;

printf("b[%d] = %d\n",j,b[j]);

quan(a, b, 20, j);
printf("\n");
printf("*******围成的圈是**********\n");
for(i = 0; i < 20; i ++)
printf("%d ",b[i]);
printf("\n");
return 0;
}
运行的结果是:1 2 3 4 7 6 5 8 9 10 13 16 15 17 12 11 20 19 -858993460,为什么会是这个结果呢?想了好久还是想不明白,希望高手可以帮帮指点指点。
搜索更多相关主题的帖子: void 读者 include 自然数 return 
2012-03-23 14:33
婷婷99
Rank: 1
等 级:新手上路
帖 子:48
专家分:7
注 册:2012-2-28
收藏
得分:0 
回复 2楼 有容就大
应该存在吧,虽然我没有得到结果。这是一本书上的思考题。
2012-03-23 17:08
婷婷99
Rank: 1
等 级:新手上路
帖 子:48
专家分:7
注 册:2012-2-28
收藏
得分:0 
回复 4楼 c_cup
因为12可以和11匹配也可以和19匹配,但是我这么写循环的话,先找到11,但是19才是最合适的。而我不知道怎么回溯回去了……
2012-03-23 18:26
婷婷99
Rank: 1
等 级:新手上路
帖 子:48
专家分:7
注 册:2012-2-28
收藏
得分:0 
C程序百例
2012-03-23 20:26
婷婷99
Rank: 1
等 级:新手上路
帖 子:48
专家分:7
注 册:2012-2-28
收藏
得分:0 
回复 8楼 c_cup
不过你给的这两组都不对,第一组的第一个数和最后一个数连起来1 + 20 = 21是一个合数,第二组的19 + 20 也是一个合数。
2012-03-23 20:53
婷婷99
Rank: 1
等 级:新手上路
帖 子:48
专家分:7
注 册:2012-2-28
收藏
得分:0 
回复 11楼 Devil_W
这个我没写出来。不过我在另一个论坛里也发了同样的帖子,有人回了代码。我贴出来给大家看看……
如下:
程序代码:
#include<stdio.h>
#include<math.h>
#define N 20
bool Prime(int n)
{
    int k = (int)sqrt(n);
    for(int i = 2; i <= k; i ++)
    {
        if(n % i == 0)
        {
            return false;
        }
    }
    return true;
}
bool Check(int a[], int n, int i)
{
    for(int j = 0; j < n; j ++)
    {
        if(a[j] == i)
        {
            return false;
        }
    }
    if(n < N-1)
    {
        return (Prime(a[n-1]+i));
    }
    else
    { 
    return (Prime(a[0]+i) && Prime(a[n-1]+i));
    }
}
void PrimeCircle(int a[], int n)
{
    for(int i = 1; i <= N; i ++)
    {
        if(Check(a,n,i))
        {
            a[n] = i;
            if(n == N-1)
            {
                for(int j = 0; j < N; j ++)
                {
                    printf("%d ", a[j]);
                }
            printf("\n");
            }
            else
            {
                PrimeCircle(a, n+1);
            }
            a[n] = 0;
        }
    }
}
int main()
{
    int a[N];
    PrimeCircle(a, 0);
    return 0;
}
2012-03-24 21:14
婷婷99
Rank: 1
等 级:新手上路
帖 子:48
专家分:7
注 册:2012-2-28
收藏
得分:0 
代码我是没怎么看懂。自我感觉数学不好,逻辑能力不强。

大家看看吧,看能不能看得懂,交流一下。
2012-03-24 21:17
婷婷99
Rank: 1
等 级:新手上路
帖 子:48
专家分:7
注 册:2012-2-28
收藏
得分:0 
回复 15楼 beyondyf
版主真是一码惊人啊……
2012-03-25 13:35
快速回复:将1,2,3,4……20这20个自然数排成一个圈,使任意两个相邻的自热数之和 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043733 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved