| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 861 人关注过本帖
标题:编写一个程序证明吉尔布雷德原理,感激不尽啊,
只看楼主 加入收藏
薛少鹏
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-3-17
结帖率:75%
收藏
已结贴  问题点数:10 回复次数:7 
编写一个程序证明吉尔布雷德原理,感激不尽啊,
:拿出一副扑克牌,将大,小王去掉,使他们红黑相间,再把这副牌分成两叠,让每叠下面的那张牌颜色不同,接着把牌再洗在一起。然后,从洗过的牌底下逐对拿牌。这时,奇迹就会出现,不管原理如何洗牌,拿出的牌总是一红一黑
搜索更多相关主题的帖子: 扑克牌 奇迹 
2011-05-20 23:21
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:5 
想到一个用枚举法的,但逻辑上只能保证在 n 次试验下原理正确,程序应该不需要注释

#include <stdio.h>
#include <stdlib.h>

void xipai(int a[],int b[],int c[]);
int judge(int c[]);

int main(void)
{
    int a[26];
    int b[26];
    int c[52];
    int i,j,n;
    for(i=0;i<26;i+=2)
    {
        a[i]=1;
        a[i+1]=0;
    }
    for(i=0;i<26;i+=2)
    {
        b[i]=0;
        b[i+1]=1;
    }
    n=1000;
    for(i=0;i<n;i++)
    {
        xipai(a,b,c);
        j=judge(c);
        if(j==0)
            break;
    }
    if(j==1)
        printf("good\n");
    return 0;
}


void xipai(int a[],int b[],int c[])
{
    int i=0,j=0,n,k;
    for(k=0;k<52;k++)
    {
        n=rand()%2;
        if(n==1)
        {
            c[k]=a[i];
            i++;
        }
        else
        {
            c[k]=b[j];
            j++;
        }
    }
}

int judge(int c[])
{
    int i;
    for(i=0;i<26;i+=2)
    {
        if(c[i]==c[i+1])
            return 0;
        else
            continue;
    }
    return 1;
}
2011-05-21 09:14
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
……洗牌函数有缺陷得改改

void xipai(int a[],int b[],int c[])
{
    int i=0,j=0,n,k;
    for(k=0;k<52;k++)
    {
        n=rand()%2;
        if(n==1)
        {
            if(i<26)
            {
                c[k]=a[i];
                i++;
            }
            else
            {
                c[k]=b[j];
                j++;
            }
        }
        else
        {
            if(j<26)
            {
                c[k]=b[j];
                j++;
            }
            else
            {
                c[k]=a[i];
                i++;
            }
        }
    }
}}

2011-05-21 09:23
薛少鹏
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-3-17
收藏
得分:0 
我们老师已经帮我们划成了6个函数了,1.拿出一副扑克牌,将大小王去掉,使他们红黑相间,2.再把这副牌分成两叠,让每叠下面的哪张牌颜色不同   3.接着把牌再洗在一起   4.从洗过的牌底下逐对拿牌   5.输出整副扑克牌  6.主函数
2011-05-21 09:39
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
那老师有没有说,证明使用什么思路?
是必须逻辑完备的证明,还是可以使用所谓实验证明的方法?

对于你的函数,
1.拿出一副扑克牌,将大小王去掉,使他们红黑相间,2.再把这副牌分成两叠,让每叠下面的哪张牌颜色不同  
就是
    int a[26];
    int b[26];
    int c[52];
    int i,j,n;
    for(i=0;i<26;i+=2)
    {
        a[i]=1;
        a[i+1]=0;
    }
    for(i=0;i<26;i+=2)
    {
        b[i]=0;
        b[i+1]=1;
    }
3.接着把牌再洗在一起  就是 void xipai();
4.从洗过的牌底下逐对拿牌  就是 int judge();
我这函数里没有你的 5 ,

不过主要问题还是你老师需要什么样的证明
2011-05-21 09:49
薛少鹏
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-3-17
收藏
得分:0 
回复 5楼 obstratiker
没有说要用什么方法,只是说要用到一维,二维数组而已,
还有,怎么你的代码
图片附件: 游客没有浏览图片的权限,请 登录注册
的结果只是输出   good  ,我用的是TC3.1编译器,

[ 本帖最后由 薛少鹏 于 2011-5-21 22:28 编辑 ]
2011-05-21 22:13
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
贪图简便就输出 good 了
int judge(int c[]) 每两张的判断,是否有相同颜色的牌,判断 26 次
如果没有,表示原理正确了,就返回 j==1
最后 if (j==1) 的话,就输出 good
你也可以输出别的啊,比如
if (j==1)
{
    for(k=0;k<26;k+=2)
        printf("%d  ",c[k]);
        printf("%d  \n",c[k+1]);
}

话说这代码不难,没好好看吗?
2011-05-22 08:28
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:5 
那个
俺先去学一下吉尔布雷德原理。。
非科班出身的不懂的太多了。。。
2011-05-22 09:16
快速回复:编写一个程序证明吉尔布雷德原理,感激不尽啊,
数据加载中...
 
   



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

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