PAT刷题–12.31
1032乙级 继续3n+1猜想
主要思路是使用两个数组,一个数组用来存储输入的数,另一个数组用来做标记,反是在一个数验证猜想过程中得到的其他的数,全部将其标志位置为0,并且为了不超过时间限制,只要某个数被置为了0,就不再对其进行进行猜想验证。
遇到的坑:在一开始设置数组大小为100,会出现数组越界问题,主要是没有考虑到在猜想验证过程中数组可能会因为*3而增大,因此在设置数组大小时应考虑这一点,将其尽量设置的大。
#include "stdio.h"int main()
{ int n, k=0,t=0;
int A[10000] = { 0 };
int B[10000] = { 0 };
int max = 0;
int count=0;
scanf("%d\n", &n);
for (int i = 1; i <= n; i++)
{ scanf("%d", &B[i]); A[B[i]] = 1; }
for (int i = 1; i <= n; i++)
{ if (max < B[i]) max = B[i]; }
for (int i = 1; i <= n; i++)
{ t = B[i];
while (B[i] > 1&&A[t]!=0)
{
if (B[i] % 2 == 0)
{
B[i] = B[i] / 2;
if (A[B[i]] != 0)
{ A[B[i]] = 0; }
}
else if (B[i] % 2 != 0)
{
k = B[i] * 3 + 1;
B[i] = k / 2;
if (A[k / 2] != 0) {
A[k / 2] = 0; }
}
}
}
for (int i = max; i >= 1; i--)
{ if (A[i] != 0)
count++; }
for (int i = max; i >= 1; i--)
{ if (A[i] != 0&&count>1)
{ printf("%d ",i);
count--; }
else if(count==1&&A[i]!=0)
printf("%d\n",i); }}