标题:这种题怎么做哦?编程?
只看楼主
youyuanjia
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-9-19
结帖率:84.62%
已结贴  问题点数:20 回复次数:9 
这种题怎么做哦?编程?
1、一辆卡车违反交通规则,撞人后逃跑。现场有三人目击了事件过程,但都没有记住四号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。



2、诚实族和说谎族是来自两个荒岛的不同民族,诚实族的人永远说真话,而说谎族的人永远说假话。迷语博士是个聪明的人,他要来判断所遇到的人是来自哪个民族的。
   迷语博士遇到三个人,知道他们可有是来自诚实族或说谎族的,为了调查这三个人是什么族的,博士分别问了他们的问题,这是他们的对话:
  问第一个人:“你们是什么族?”答:“我们之中有两个来自诚实族。”第二个人说:“不要胡说,我们三个人中只有一个是诚实族的。”第三个人听了第二个人的话后说:“对,就是只有一个诚实族的。”
  请根据他的回答判断他们分别是哪个族的?
搜索更多相关主题的帖子: 博士 牌照 交通规则 数学家 民族 
2010-03-11 23:10
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:10 
1.
int main(void)
{
    int i, ii;
    for (i = 0; i<100;i++)
    {
        ii = i*i;
        if (ii/1000 == (ii/100%10) && (ii/10%10) == ii%10)
        {
            if (ii/1000 != (ii/10))
            {
                printf("i = %d\n", i);
                printf("%04d ", ii);
            }
        }
    }
}
2.
int main(void)
{
    int i,sum = 0, t1,t2,t3;
    for (i = 0; i < 8; i ++)
    {
        t1 = (i>>2) & 1;
        t2 = (i>>1) & 1;
        t3 = (i>>0) & 1;
        sum = t1+t2+t3;
        if (t1)  //如果第一个人讲的是真话
        {
            if (sum == 2)//则必有两个人是诚实族的
            {
                if(t2 || t3)//如果第二个人讲的是真话,则第三个人讲的也是真话,则共有三个人讲真话,且只有一个人讲真话(不可能的)
                {
                    if (sum == 1 && sum == 3)
                    {
                        printf("%d %d %d\n", t1, t2, t3);
                    }
                }else//后两个人讲假话,sum==1,且sum!=1(也不可能)
                {
                    if (sum != 1 && sum == 1)
                    {
                        printf("%d %d %d\n", t1, t2, t3);
                    }
                }
            }
        }else//第一个人讲的是假话
        {
            if (sum != 2)//sum必不等于2
            {
                if(t2||t3)//如果后两人讲的是真话,sum==1,且sum==2(不可能)
                {
                    if (sum == 1 && sum == 2)
                    {
                        printf("%d %d %d\n", t1, t2, t3);
                    }
                }else//如果后两人讲的是假话,sum==0,且sum!=1
                {
                    if (sum == 0 && sum != 1)
                    {
                        printf("%d %d %d\n", t1, t2, t3);
                    }
                }
            }
        }
    }
}
第二个程序感觉怪怪的
2010-03-12 01:37
rib
Rank: 4
等 级:业余侠客
帖 子:95
专家分:252
注 册:2009-3-30
得分:5 
1.
int main(void)
{
    int i, ii;
    for (i = 32; i<100;i++)
    {
        ii = i*i;
        if (ii/1000 == (ii/100%10) && (ii/10%10) == ii%10)
        {
            if (ii/1000 != (ii%10))
            {
                printf("i = %d\n", i);
                printf("%04d ", ii);
            }
        }
    }
}


2楼代码第1题有个小错误

[ 本帖最后由 rib 于 2010-3-12 10:49 编辑 ]
2010-03-12 10:47
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:0 
呵呵,贴上去就被没仔细看了,原来这个符号被改了,汗。。。。
2010-03-12 10:52
rib
Rank: 4
等 级:业余侠客
帖 子:95
专家分:252
注 册:2009-3-30
得分:0 
第2题还真没理出个算法来

第一个人是说谎族

第2 3人是诚实族

应该是这样的!


2010-03-12 11:07
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:0 
第二题打印出的结果1表示是诚实族的,0表示是说谎族的,sum表示是诚实族的人数;
这个很好判断呀,要是第一个人的是真话,则应该有两个人是诚实族的,这样,后来两个人的话肯定是假的了,则就不可能有两个是诚实族的了;
所以第一个人的是假话,也就是他是说谎族的,如果第二个人的话是真话那第三个人的话也是真话,则有两个人是诚实族的,但又与他们的话矛盾了,所以后两个人也是说谎族的
2010-03-12 11:40
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
得分:5 
分析第二题:
设三个人为:A、B、C
A说3人中有两个诚实,B说只有一个诚实,C说:对,有一个诚实

假设一:
假如A是诚实的,那B、C中要有一个为诚实,才符合A的说法,但B、C都说只有一个诚实的,B和C都说了谎,三人2谎1诚和A说的三人1谎2诚不符。

假设二:
假如A是说谎的,那B则是诚实的,C也是诚实的,2诚1谎,也不符。

两个假设都不符,结果只有A、B、C都说了谎,才能符合他们说的话。
用代码写这题觉得没意义。

努力—前进—变老—退休—入土
2010-03-12 12:42
youyuanjia
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-9-19
得分:0 
回复 2楼 ldg628
可以给我讲讲这两道题不?
其中1题中i和ii分别代表什么哦?
还有第二题怎么理解t1,t2,t3,sum?
2010-03-14 09:09
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:0 
1.因为车牌是四位数,并且是一个整数的平方,i就代表了这个整数(i<100,若>=100,它的平方就超过四位数了),ii=i*i,即为我们要求的车牌号.
2.t1.t2.t3分别代表三个人是否是诚实族的人(1是,0否),它们的排列方式有8种,可以用数字0~7的二进制的低三位分别表示三个人的身份,sum表示诚实族人数的总数
2010-03-14 10:12
雾里偷花
Rank: 2
来 自:社会
等 级:论坛游民
帖 子:45
专家分:33
注 册:2009-10-27
得分:0 
程序代码:
#include <stdio.h>
int main(void)
{
    int i,a,b,c,d,n;
    for(i=1000;i<=9999;i++)
    {
        a=i%1000%100%10;
        b=i%1000%100/10;
        c=i%1000/100;
        d=i/1000;
        if(a==b&&c==d&&a!=c)
        for(n=1;n<6;n++)
        {
            if(n*n==a+b+c+d)
            {
                printf("%d%d%d%d\n",a,b,c,d);
                printf("%d%d%d%d\n",d,c,b,a);
            }
        }
    }
}
第一题
2010-03-14 23:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-299156-1-1.html




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

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