网站大量收购独家精品文档,联系QQ:2885784924

很难的逻辑推理题,但编程不难(难,趣味).docx

很难的逻辑推理题,但编程不难(难,趣味).docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
引子: 小明和小强都知道,张老师的生日是以下十个日期中的一个: 3月 4日 3月 5日 3月 8日 6月 4日 6月 7日 9月 1日 9月 5日 12 月 1 日 12 月 2 日 12 月 8 日 张老师把生日的月份告诉给了小明, 把生日的日子告诉了小强。 问他们能不能推导出自己的 生日。 小明说,如果自己不知道,小强也不知道。 小强说,自己本来不知道,但是现在知道了。 小明又说,现在自己也知道了。 现在,大家知道不知道张老师的生日? 答案是 9月 1 日 推理过程: “小明说,如果自己不知道,小强也不知道。 “推出 仅是 3 或 9 月,因为这两个月的所有 日子在这里都出现两次以上。 “小强说,自己本来不知道,但是现在知道了“推出,仅可能是 1 或 4 或 8 日。因为小强 本来不知道( 1,4,5,8 都符合),又突然知道(原因是他也能猜到是 3 或 9 月,拿着自己 的日子一比就知道了) ,既然小强知道就排除了 5 “小明又说,现在自己也知道了。 “推出是 9 月 1 日。因为对于我们来说现在可能是 3 月 4 日,3月8日和9月1日 我们能猜出是 1或 4或8 日,小明也能,拿着月份一比就知道 了。所以是 9 月 1 日而不是 3 月的那两个日子。 正题:运用上面的推理过程来解下面的题 有x和y两个整数,并且 x! =y。 (2v=x,yv=99 )。 小明知道x、y的和,小强指导 x、y的积。 小明说,如果自己不知道,小强也不知道。 小强说,自己本来不知道,但是现在知道了。 小明又说,现在自己也知道了。 问 x 和 y 是几。 答案 4 和 13 解法: #includestdio.h #includemath.h //打印数组 void print(const int* a,int len) int i=0; for(i=0;ilen;i++) printf(%d ,a[i]); printf(\n); } //求一个整数按积拆分,有几种可能性 int ji(int n) { int i,count=0; for(i=2;isqrt(n);i++) { if(n%i==0) { int j=n/i; if(j=99) count++; } } return count; } i,在取值//小明说,如果自己不知道,小强也不知道。 猜两数和的集合 , i,在取值 范围内使得 i 所有的按和拆分组成的乘积都有两种以上的拆分方案 //如 11=2+9=3+8=4+7=5+6 //2*9=18 3*6=18 //3*8=24 4*6=2*12=24 //4*7=28 2*14=28 int f1(int * a) { int i; int len=0; for(i=7;i=98+99;i+=2) { int j; for(j=2;ji/2;j++) { int n=(i-j)*j; if(ji(n)=1) break; } if(j==i/2) a[len++]=i; } return len; ////求一个数是否出现在数组中 int is_in_arr(int n,int * a,int len_a) { int i; for(i=0;ilen_a;i++) if(a[i]==n) return 1; return 0; } //小强说,自己本来不知道,但是现在知道了。猜两个数乘积的集合,即找到这样的整数 i i 的所有按积拆分, //组成的和在上面函数 f1 产生的数组中出现且仅出现 1 次。 int f2(int * b,int *a,int len_a) { int i; int len=0; for(i=6;i=98*99;i+=2) { int j;int count=0; for(j=2;jsqrt(i);j++) { if(i%j==0i/j=99) { int n=j+i/j; if(is_in_arr(n,a,len_a)) count++; } } if(count==1) b[len++]=i; } return len; } 〃小明又说,现在自己也知道了。猜两个数乘和,即找到这样的整数 i,从函数fl产生的数 组中挑选 i, i 的所有按和拆分, //组成的积在上面函数 f3 产生的数组中出现且仅出现 1 次。 int f3(int * c,int *a,int len_a,int* b,int len_b) { int i; int len=0; for(i=0;ilen_a;i++) { int j;int count=0; for(j=2;j=a[i]/2;j++) { int n=j*(a[i]-j); if(is_in_arr(n,b,len_b)) count++; } if(c

文档评论(0)

wumanduo11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档