本题主要考虑如何将一个数在(3n+1)过程中将出现过的数从输入的队列数组中去除。本代码用将每次运算过程中产生的数和输入数组比较如果有就将其变为0没有就留下,后面输入数组就变成了0和没有在过程中出现过的数了,在将数组排序输出就好了。
#include<stdio.h>
#include<string.h>
#include <iostream>
#include<stack>
using namespace std;
int main()
{
int n;
stack<int> T;
cin >> n;
int* a = new int [n];
int l[500] = { 0 };
for (int i=0;i < n;i++) {
cin >> a[i];
}
for (int i = 0;i < n;i++) {
int temp = a[i];
while (temp!=0&&temp!=2) {
if (temp % 2 == 0)
temp = temp / 2;
else
temp = (temp * 3 + 1) / 2;
for (int i = 0;i < n;i++) {
if (a[i] == temp)
a[i] = 0;
}
}
}
for (int i = 0;i < n-1;i++) {
for (int k = 0;k < n-i-1;k++) {
if (a[k] < a[k + 1]) {
swap(a[k], a[k + 1]);
}
}
}
for (int i = 0;i < n;i++) {
if (a[i] != 0) {
if (a[i + 1] != 0)
cout << a[i] << " ";
else
cout << a[i];
}
}
}