- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)