代码:
#include <iostream>
using namespace std;
int main()
{
int n,a;
cin >> n;
int arr[100] = { 0 };
int arr1[100] = { 0 };
for (int i = 0; i < n; i++)
{
cin >> arr[i];
if (arr[i] >= 1 && arr[i] <= 100)
{
arr1[i] = arr[i];
}
else
arr1[i] = 1;
}
for (int i = 0; i < n && arr[i] != 1; i++)
{
if (arr[i] % 2 == 1)
arr[i] = (3 * arr[i] + 1) / 2;
else
arr[i] = arr[i] / 2;
for (int j = 0; j < n; j++)
{
if (arr[i] == arr1[j])
arr1[j] = 1;
}
}
for (int i = 0; i < n-1; i++)
{
for (int j = i+1; j < n; j++)
{
if (arr1[i] < arr1[j])
{
a = arr1[i];
arr1[i] = arr1[j];
arr1[j] = a;
}
}
}
cout << arr1[0];
for (int i = 1; i < n; i++)
{
if (arr1[i] != 1)
cout << ' ' << arr1[i];
}
return 0;
}
测试结果:只有第一个测试点过了
题呢?
第8、9两行的 ={0}可以不要,第13行不能取1 if (arr[i] > 1 && arr[i] <= 100),第32行到第43行可以改成一个sort排序,最后的输出不太确定
#include <algorithm>
#include <iostream>
using namespace std;
int main(){
int hash[10000]={0}; //数组开大一点,不然会数组越界段错误(如n为95时可以达到485)
int x,n,a[110],num=0;
cin>>x;
for(int i=0;i<x;i++){
cin>>a[i];
n=a[i];
if(hash[n]==1) //如在前面过程中已经出现覆盖过一次,直接跳过这个数(不可能合格)
continue;
while(n>1){
if(n%2==0)
n/=2;
else n=(3*n+1)/2;
hash[n]=1;
}
}
sort(a,a+x); //默认从小到大排序,之后的循环从大到小输出
for(int i=x-1;i>=0;i--){
if(hash[a[i]]==0){
num++;
if(num>1) cout<<" "; //非第一个合格的数时,先输出空格再输出数字
cout<<a[i];
}
}
return 0;
}