1005 继续3n+1猜想
题目描述
解题思路
两个思路:1.先排序,再剔除验证时重复的。2.先剔除验证时重复的,再排序。
剔除的规则是:除本身外,验证过程中发现相等的标记为0。
具体实现看代码
代码实现(以思路1为例)(本次以快排的方式实现
#include <stdio.h>
#include <stdlib.h>
//快排,看不懂的上面有链接
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;
}