PAT乙级1005:继续(3n+1)猜想

在这里插入图片描述

使用二分查找前一定记得排序啊啊啊啊!!!

#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;
}



原创文章 85 获赞 86 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43699840/article/details/105168664