pat乙级1005测试点1,3,4答案错误

测试给出数据,输出结果正确
思路是 将数组a中砍后的元素和数组b比对,一样的,将b中赋值0标记,再降序排列,截取非零部分输出,
代码见下

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b);

int main(void)
{
int K;
scanf("%d", &K);

int a[K], b[K], i=0;
for (; i<K; i++)
{
    scanf("%d", &a[i]);
    b[i] = a[i]; 
}

for (i=0; i<K; i++)  
{
    if (a[i] != 0)
    {
        if (a[i]%2 == 0)
        {
            a[i] /= 2;
        }
        else
        {
            if (a[i] > 100) a[i] = 1;
            a[i] = (3*a[i]+1)/2; 
        }
    }
    int j=0;
    for (; j<K; j++)
    {
        if (a[i]==b[j])
        {
            b[j]=0;
        }
    }
}

qsort(b, K, sizeof(int), cmp);

int j; 
for (i=0; i<K; i++) 
{
    if (b[i] == 0) 
    {
        j = i-1;
        break;
    }
}

for (i=0; i<j; i++)
{
    printf("%d ", b[i]);
}
printf("%d", b[j]);

return 0;

}

int cmp(const void *a, const void *b)
{
return *(int )b-(int *)a;
}

参考这个算法。

#include<iostream>
using namespace std;
 
/*排序算法*/
void sort(int n[],int k){
    int i,j,temp;
    for(i=0;i<k;i++)
    for(j=i+1;j<k;j++)
    {
        if(n[i]<n[j])
        {
            temp=n[i];
            n[i]=n[j];
            n[j]=temp;
        }
    }
}
 
int main(){
    int k,n[101];
    int i,j;
    cin>>k;
    for(i=0;i<k;i++){
        cin>>n[i];
    }
 
    for(i=0;i<k;i++){
        int num = n[i];
        if(num == 0) continue;
        while(num != 1) {
            if(num%2 == 0)//为偶数
                num = num/2;
            else
                num=(3*num+1)/2;//为奇数
            for(j=0;j<k;j++)
            {
                if(n[j]==num)
                 {
                     n[j]=0;break;
                 }
            }
        }
    }
    sort(n,k);
    for(i=0;n[i]>0;i++){
        cout<<n[i]<<(n[i+1]>0?" ":"");
    }
    return 0;
}