请给出C语言实现代码,描述 对于一个元素为数字1-9的集合A(每个数字的数量不超过4个,集合中元素的数量不超过14个),判断其是否满足如下规则: 集合A可以分割为若干个由3个数字组成的集合Bo...Bn和一个由2个数字组成的集合C。其中Bo...Bn需要满足每个集合中的数字均相等或者依次递增一(例如5 5 5以及4 5 6均满足条件);C中的两个数字相等 显然,当集合中的元素个数等于3n+2(n=0,1..4)时才有可能满足上述条件,我们将元素个数不为3n+2的集合称为“相公”的集合,满足上述条件的集合称为能够“胡”的集合,否则则是“不胡”的集合 输入 输入的每一行包括一组测试数据,测试数据的开头为0表示测试结束;每一组数据由若干个1-9的数字组成,数字之间用空格隔开 输出 每一行输出对应一行输入的结果,对于“相公”的集合输出“XIANGGONG”;对于满足“胡”的集合,输出“HU”;否则输出“BUHU” 样例输入 1 2 4 4 1 1 1 2 3 4 5 6 7 8 9 9 9 1 1 1 2 3 4 5 6 7 8 9 9 9 9 0 样例输出 BUHU HU XIANGGONG HU
时间: 2024-04-07 17:29:04 浏览: 46
以下是C语言实现代码:
```c
#include <stdio.h>
#include <stdbool.h>
// 判断一个集合是否能够“胡”
bool canHu(int nums[], int n) {
if (n % 3 != 2) { // 集合不满足3n+2的条件
return false;
}
// 先对集合进行排序
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (nums[i] > nums[j]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
// 判断是否能够分割为Bo...Bn和C
int i = 0;
while (i < n - 2) {
if (nums[i] == nums[i+1] && nums[i+1] == nums[i+2]) { // 找到一个由3个数字组成的集合
i += 3;
} else if (nums[i]+1 == nums[i+1] && nums[i+1]+1 == nums[i+2]) { // 找到一个由3个递增数字组成的集合
i += 3;
} else {
return false;
}
}
if (i == n - 2 && nums[i] != nums[i+1]) { // 判断C中的数字是否相等
return false;
}
return true;
}
int main() {
int nums[14];
int n;
while (true) {
scanf("%d", &n);
if (n == 0) { // 输入0表示结束测试
break;
}
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
if (n % 3 != 2) { // 集合不满足3n+2的条件
printf("XIANGGONG\n");
} else if (canHu(nums, n)) { // 判断是否能够“胡”
printf("HU\n");
} else {
printf("BUHU\n");
}
}
return 0;
}
```
输入格式为每行先输入集合中元素的个数n,然后输入n个元素,数字之间用空格隔开。程序会不断读入测试数据,直到输入0为止。输出格式为每行输出对应一行输入的结果,对于“相公”的集合输出“XIANGGONG”;对于满足“胡”的集合,输出“HU”;否则输出“BUHU”。
阅读全文