解析
代码比较详细了,如果对动态数组申请和qsort()
函数的使用不熟悉,可以看我的这两篇博文:
代码
#include <stdio.h>
#include <stdlib.h>
int compare (const void * a, const void * b) //qsort()中需要的比较函数
{
return ( *(int*)b - *(int*)a ); //这里的数组元素类型为int
}
int main(int argc, char *argv[]) {
int i,j;
int K;
int n;
int *num; //声明int型指针,为申请动态数组做准备
scanf("%d", &K);
//申请动态数组,在内存的动态存储区中分 K 个长度为 sizeof(int) 的连续空间,
// 函数返回一个指向分配起始地址的指针;
num = (int *)malloc(K*sizeof(int));
for(i=0; i<K; i++)
{
scanf("%d", &num[i]);
}
for(i=0; i<K; i++){
n = num[i];
while(n!=1)
{
if(n%2==0) //如果是偶数
{
n=n/2;
}else{
n = (3*n+1)/2;
}
for(j=0; j<K; j++)
{
if(num[j]==n)
{
num[j]=1; //如果这个数被覆盖,则将此数置为1
}
}
}
}
qsort (num, K, sizeof(int), compare); //使用qsort()库函数进行排序
i=0;
while(num[i]!=1)
{
if(num[i+1]==1){
printf("%d", num[i]);
}else{
printf("%d ", num[i]);
}
i++;
}
free(num); //释放动态申请的资源
return 0;
}
注意:最后需要释放动态申请的数组资源。
free(num);