PAT乙級1005. 繼續(3n+1)猜想(C語言)
阿新 • • 發佈:2019-01-09
/*
* (3n+1)猜想 的迴圈計算條件是 數字 != 1
* 不能被數列中的其他數字所覆蓋為“關鍵數” ----> 能被覆蓋的數最終也會變成1;
* 即 遍歷數列,將非關鍵數改為1後,剩下的就是關鍵數。
*/
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {//降序
return *(int *)b > *(int *)a;
}
int main() {
int K; //正整數的數量
scanf("%d" ,&K);
int arr[K]; //建立存放數字的陣列
for (int i = 0; i < K; i++) {
scanf("%d", &arr[i]);
}
for (int i = 0; i < K; i++) { //篩選關鍵數字
int num = arr[i];
while (num != 1) {//進行(3n+1)猜想
if(num % 2 == 0) {
num /= 2;
} else {
num = (3 *num + 1) / 2;
}
for (int j = 0; j < K; j++) {//遍歷陣列,如果是被覆蓋的數,變為1
if (arr[j] == num) {
arr[j] = 1;
break;// 因為陣列的數字各不相同,找到被覆蓋的即可跳出迴圈
}
}
}
}
qsort(arr, K, sizeof(int), cmp); // 快速排序
for (int i = 0; arr[i] != 1 && i < K; i++) { //輸出關鍵字
if(i != 0) {
printf(" ");
}
printf("%d", arr[i]);
}
}