1005 继续(3n+1)猜想

1005 继续3n+1猜想

  • 题目描述
  • 解题思路
  • 代码实现(以思路1为例)(本次以快排的方式实现

题目描述

点击直达题目链接
1005 继续(3n+1)猜想_第1张图片

解题思路

两个思路:1.先排序,再剔除验证时重复的。2.先剔除验证时重复的,再排序。
剔除的规则是:除本身外,验证过程中发现相等的标记为0。

具体实现看代码

代码实现(以思路1为例)(本次以快排的方式实现

快速排序直达链接

#include 
#include 
//快排,看不懂的上面有链接
void quick_sort(int* arr,int left,int right)
{
	int temp = arr[left];
	int a = left;
	int b = right;
	if (a >= b)
		return;
	while (a<b)
	{
		while (arr[b] <= temp&& a < b)
			b--;
		while (arr[a] >= temp && a < b)
			a++;
		//交换
		int t = arr[a];
		arr[a] = arr[b];
		arr[b] = t;
	}
	arr[left] = arr[a];
	arr[a] = temp;
	quick_sort(arr, left, a-1);
	quick_sort(arr, b+1, right);
}

void delete(int* arr,int n)
{
	int i = 0,j=0;
	for (i=0;i<n;i++)
	{
		int temp = arr[i];
		while (temp != 1&&temp)//保证这个数不是0
		{
			if (temp % 2 == 0)
				temp /= 2;
			else
				temp = (temp* 3 + 1) / 2;
			for (j = 0; j < n; j++)
			{
				if (arr[j] == temp)
					arr[j] = 0;
			}
		}
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	int* arr = (int*)malloc(n * sizeof(int));
	int i = 0;
	for (i=0;i<n;i++)
	{
		scanf("%d", arr + i);
	}
	//排序
	quick_sort(arr, 0, n - 1);
	//删除重复的
	delete(arr,n);
	//确定剩余几个数,目的是控制最后一个不打印空格
	int b = 0;
	for (i = 0; i < n; i++)
	{
		if (arr[i] == 0)
			b++;
	}
	b = n - b;
	//打印
	for (i=0;i<n;i++)
	{
		if (arr[i] != 0)
		{
			printf("%d", arr[i]);
			if (b-1)
			{
				printf(" ");
				b--;
			}
		}
	}
	free(arr);
	arr = NULL;
	return 0;
}

在这里插入图片描述

你可能感兴趣的:(#,PAT乙级刷题笔记,c语言,开发语言,后端)