PAT 乙级 1005题
采用数组储存每个数的状态,初始化数组所有值为0,读入的数据状态置1,计算初始值所产生的Callatz的覆盖值置2。
#include <stdio.h>
#include <stdlib.h>
int Callatz(int n);
int main()
{
int K = 0, count = 0;
int num[101] = { 0 };
int x = 0;
while (scanf("%d", &K) != 1)
;
count = K;//count记录未被覆盖的输入值,即关键数个数
//读入数据并置1
for (int i = 0; i < K; i++) {
if (scanf("%d", &x) == 1)
;
num[x] = 1;
}
//从小到大循环检测初始值并计算Callatz并将其置为2
//注意:Callatz(int n)返回值大于100导致数组越界导致部分错误
for (int i = 0; i < 100; i++) {
int x = i + 1;//方便debug
if (num[x] == 1) {
x = Callatz(x);
while (x > 100 || num[x] == 0 || num[x] == 1) {//将x>0的判断条件放到首位,防止数组越界
if (x <= 100 && num[x] == 1) {//说明初始值被覆盖,可直接跳过检测
count--;
}
if (x <= 100) {//注意:Callatz(int n)返回值大于100时应跳过数组访问和条件判断
num[x] = 2;
}
x = Callatz(x);
}
}
}
for (int i = 100; i > 0; i--) {
if (num[i] == 1) {
printf("%d", i);
count--;
if (count > 0) {
printf(" ");
}
}
}
}
int Callatz(int n)
{
if (n % 2 == 0) {
n /= 2;
} else {
n = (3 * n + 1) / 2;
}
return n;
}