测试给出数据,输出结果正确
思路是 将数组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;
}