超难C语言题目 不想死的进 我分数不多想拿分的也表来

来源:百度知道 编辑:UC知道 时间:2024/06/11 06:13:58
题目是:有A、B、C、D四个人。C从1~50中选出了两个数(不是1也不是50但有可能是重复的),C把两个数之和告诉了A,并把两个数之积告诉了B,然后让他们猜着两个数是多少。A首先说,我猜不着。B也说,我也猜不着。这时候A说,那我能猜着了。B说,那我也猜着了。这时如果你是D,能不能猜到两个数是什么?
用C语言编译 输出答案 需要具体程序

一楼的判断思路有一点点问题,我总结了一下这道题的几个充要条件:
1.B知道两数之积,却猜不到,说明两数不可能同时为质数
2.根据上面一点进一步分析,我们还可以知道B所知道的两数之积如果拆分成两个数,这两个数的组合情况(不同为质数)一定超过两种以上
3.A虽然知道两数之和,但是在确认两数不可能同时为质数后才猜到,说明A知道的这个和数,拆分成两个数(两数相加是他知道的那个和)后,有几种组合方式,比如是两个质数,两个合数,或者一个质数一个合数,但是A通过B的回答知道了不可能为两个质数的组合,所以我们判定,在他知道和的值情况下,所有的拆分情况当中只有一种组合是两个数不能同时为质数(我说的好像很拗口),其他的组合均是两数同为质数
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define MAXNUM ((50 - 2)*(50 - 3)/2 + 48) //用组合数公式计算最大组合数,还要加上两数相同的情况

int iscomposite(int a);//传入一个数,判断该数是否为合数
int only_one_prime(int a);//传入一个数,并将该数拆分成两数之和,判断在所有可能拆分情况下,只有一种情况为两数都非质数
int is_more_composite(int a);//传入一个数,判断该数是否有至少两个以上的不同质因数

int main()
{
int k;
int num[48];
int calca[MAXNUM];
int comp[MAXNUM];
int temp;

k = 0;
for(int i = 0; i < 48; ++i)
num[i] = i + 2;

for(int i = 0; i < 48; ++i)
for(int j = i; j <