使用二分查找前一定记得排序啊啊啊啊!!!
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//用于降序排序的子函数,用于sort函数的一个子函数
bool func(int i, int j)
{
return i > j;
}
int main()
{
int K = 0; //K为输入的待验证的整数的个数
cin >> K;
int i = 0;
int j = 0;
int temp = 0;
int num = 0; //num用于存储v3中元素的个数
vector<int>v1; //数组v1用来存储输入的一列数
vector<int>v2; //数组v2用来存储该数列中的关键数
vector<int>v3; //v3用来存储数列中每个数所覆盖的数
vector<int>v4; //v4用来复制存储v1中的值
//输入数据
for ( i = 0; i < K; i++)
{
cin >> temp;
v1.push_back(temp);
}
//将数组v1的值拷贝到数组v4
v4.assign(v1.begin(), v1.end());
//找出被覆盖的数并存入数组v3
for ( j = 0; j < K; j++)
{
while (v1[j]!=1)
{
if ((v1[j] % 2) == 0) //n为偶数时
{
v1[j] = v1[j] / 2;
}
else //n为奇数时
{
v1[j] = (3 * v1[j] + 1) / 2;
}
v3.push_back(v1[j]);
num++;
}
}
int cnt = 0; //cnt用来存储关键数字的个数
sort(v3.begin(), v3.end()); //将v3中的元素按非降序排序
//在v3中查找未被覆盖的数
for ( i = 0; i < K; i++)
{
bool flag = binary_search(v3.begin(), v3.begin()+num, v4[i]); //二分查找
if (!flag)
{
v2.push_back(v4[i]);
cnt++;
}
}
sort(v2.begin(), v2.end(),func); //降序排序
for ( i = 0; i < cnt; i++)
{
//特别注意输出格式
if (i==cnt-1)
{
cout << v2[i];
}
else
{
cout << v2[i] << " ";
}
}
return 0;
}