1. 程式人生 > >PAT乙級1005. 繼續(3n+1)猜想(C語言)

PAT乙級1005. 繼續(3n+1)猜想(C語言)

AC

/*
 * (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]); } }