昨天刚参加的小公司笔试 奉上小小逻辑题一道 说谎题

zzt369880281 2012-11-25 06:41:24
有两个村,张村和李村
张村的人星期一三五说谎
李村的人星期二四六说谎

一人问,今天周几?结果两个村的人都回答“前天是我说谎的日子”

问:今天是周几?
...全文
5700 97 打赏 收藏 转发到动态 举报
写回复
用AI写文章
97 条回复
切换为时间正序
请发表友善的回复…
发表回复
Devin_1988 2012-12-08
  • 打赏
  • 举报
回复
我这么写为什么不对,求大神帮忙看看

public class WhenLie {
	public static void main(String[] args) {
		Day day;
		VillageA a;
		VillageB b;

		//对每一天进行判断,看前天是否都为说谎日
		for (int i = 1; i <= 7; i++) {
			day = new Day(i);
			
			a = new VillageA(day);
			b = new VillageB(day);
			Day beforeYestoday = day.yestaday().yestaday();
			
			boolean a_answer = a.answer(beforeYestoday);
			boolean b_answer = b.answer(beforeYestoday);
			
			if (!a_answer && !b_answer) {
				System.out.println(i);
			}
		}
	}
}

//A村构建一个类
class VillageA {
	boolean isTellLie = true;    //true代表说真话
	
	//初始化判定当天是否说谎日
	VillageA(Day day) {
		if (day.id == 1 || day.id == 3 || day.id == 5) {
			isTellLie = false;
		}
	}

	//回答某一天是否说谎日,此day不一定是当天
	boolean answer(Day day) {
		VillageA v = new VillageA(day);
		if (isTellLie) {
			return v.isTellLie;
		} else {
			return !v.isTellLie;
		}
	}
}

class VillageB {
	boolean isTellLie = true;

	VillageB(Day day) {
		if (day.id == 2 || day.id == 4 || day.id == 6) {
			isTellLie = false;
		}
	}

	boolean answer(Day day) {
		VillageA v = new VillageA(day);
		if (isTellLie) {
			return v.isTellLie;
		} else {
			return !v.isTellLie;
		}
	}
}

//构建一个日期类,有成员变量id表明是星期几(1代表周一,2代表周二,类推)
class Day {

	int id;

	Day(int id) {
		this.id = id;
	}

	//返回一个昨天
	Day yestaday() {
		if (id > 1) {
			id--;
		} else if (id == 1) {
			id = 7;
		}
		
		Day day = new Day(id);
		return day;
	}
}

nonesite 2012-12-07
  • 打赏
  • 举报
回复
张村的人星期一三五说谎,李村的人星期二四六说谎,那星期天要说真话。除了星期天和星期二的任何一天都满足这个条件
一名金人 2012-12-06
  • 打赏
  • 举报
回复
肯定是周一,周二的前天是星期天,题目没给出星期天情况,所以星期二和星期天不考虑。 其他的日子都是该说谎的人说了实话,不该说谎的人说了谎。 正确答案:周一~!
AlexChowKey 2012-12-06
  • 打赏
  • 举报
回复
monday
达达KZT 2012-12-05
  • 打赏
  • 举报
回复
这个问题。有点难。 正解:礼拜......
想名费脑 2012-12-05
  • 打赏
  • 举报
回复
引用
有两个村,张村和李村 张村的人星期一三五说谎 李村的人星期二四六说谎 一人问,今天周几?结果两个村的人都回答“前天是我说谎的日子”
小学水平解题 一 二 三 四 五 六 七 谎 实 谎 实 谎 实 实 谎 实 谎 实 实 反推 实 谎 实 谎 实 谎 谎 谎 实 谎 实 谎 实 谎 回到前天,天数集体左移二格 实 谎 实 谎 谎 谎 谎 实 谎 实 谎 实 结果 周六相等,都说谎了,天数加二,答案是周一
huangya0 2012-12-05
  • 打赏
  • 举报
回复
然后, 看了贴, 里边有高手编程实现, 但我没看懂 (day+5)%7; 或 if(zhang[(i+5)%7] && !li[(i+5)%7]) 这什么意思? 有人有同样的问题吗? 请高手答一下
huangya0 2012-12-05
  • 打赏
  • 举报
回复
人工推算得出是星期一
liu4626846 2012-12-05
  • 打赏
  • 举报
回复

	public static void main(String[] args) {
		boolean zhangsan[] = { false, true, false, true, false, true, true };
		boolean lisi[] = { true, false, true, false, true, false, true };
		int zq = 0;
		for (int i = 0; i < 7; i++) {
			zq = i > 1 ? i - 2 : 6 - i;
			if (((zhangsan[i] && !lisi[i]) && ((zhangsan[i] != zhangsan[zq]) || (lisi[i] != lisi[zq])))
					|| ((!zhangsan[i] && lisi[i]) && ((zhangsan[i] != zhangsan[zq]) || (lisi[i] != lisi[zq])))) {
				System.out.println(i);
			}
		}
	}
majian0331 2012-12-05
  • 打赏
  • 举报
回复
从题意可以看出,今天和前天是对立的,就是今天说真话了,那么前天一定是谎话,今天说谎话了,那么前天说真话,因此可以用下面的代码判断。 public static void main(String[] args) { boolean[] zhang = { false, true, false, true, false, true, true }; boolean[] li = { true, false, true, false, true, false, true }; String[] week = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天" }; for (int i = 0; i < WEEK; i++) { if (((zhang[i] != zhang[(i + 5) % 7]) && (li[i] != li[(i + 5) % 7]))) { System.out.println("今天是 " + week[i]); } } }
pznn7717 2012-12-05
  • 打赏
  • 举报
回复
为什么这么简单的题目,还这么多人在纠结。。
小康0924 2012-12-04
  • 打赏
  • 举报
回复
除星期天和星期二不行,其他任意一天都可以。
_Thinker 2012-12-04
  • 打赏
  • 举报
回复
学习了,题有意思!
wzb56 2012-12-04
  • 打赏
  • 举报
回复
shijie_nanjing 2012-12-04
  • 打赏
  • 举报
回复
其实简单 星期一 ---> 星期日 li:负 正 负 正 负 正 正 zh:正 负 正 负 正 负 正 简单分析,两个村的人都回答“前天是我说谎的日子”,无论谁为真,谁为假,结果都必须是负,唯一可能出现的情况就围绕着周日这天来算,简单分析,只有周一有可能
kongz007 2012-12-04
  • 打赏
  • 举报
回复
排除法:今天肯定不是1,3,4,5,6;因为这些天说谎的人,不会说自己前天也说谎。而周2不说谎的人不会说自己周日说谎。所以今天是周日
ShoulderLai 2012-12-03
  • 打赏
  • 举报
回复
星期一啦。 首先:对于星期天来说,题目并没有设定值。所以,星期天以及星期天的后天星期二,都是不可能的。因此。星期天与星期二排除在外了。 其次:星期一到六,不可能存在同时说谎或同时讲真话的一天。 终上所述,假设结论正确,唯一可求解只有一真一假的情况。所以今天只有在数列{1,3,4,5,6}里。 穷举法: 张说谎{1,3,5} 李说谎{2,4,6}. 1.假定张说谎,李说真话。那么{1,3,5}都是可能的。结合,前天说谎的条件。张只在星期一说谎了。 而李在星期一说实话,星期六他确实在说谎。故张假李真条件同时成立。故星期一是原题的解。 2.假定李说谎,张说真话。那么{4,6}都是可能的。结合,前天说谎的条件。张在星期四以及星期六的前天均没有说谎,故此时无解。 统计1与2.得出。星期一是正解! 但是道理说的有点绕口: 张在星期一说星期六说谎,因为星期六他并没有说谎,在星期一,他又必须说谎,所以他只能说前天是我说谎的日子。 而李在星期一说星期六说谎,他星期六确实说谎了,在星期一他不能说谎,他只能说出真相,他星期六那天说谎了。于是出现了,两个人说一样的话。此题,不是一奇一偶的问题,要知道此处1-2是等于6的
五更琉璃 2012-12-03
  • 打赏
  • 举报
回复
“前天是我说谎的日子” 这句话张村只有周日,周一的时候成立 李村只有周一,周二的时候成立 所以答案是周一
jcplusAres 2012-12-03
  • 打赏
  • 举报
回复
这个题列个表就出来了,然后用假设法排除不满足条件的日子,最后只有周一是合理的
itsss世界 2012-12-03
  • 打赏
  • 举报
回复
周一。。。代码上面有了。此处省略。
加载更多回复(75)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧