PAT 1005 继续 3n+1 猜想
1. 题目描述及在线测试位置
找到’关键数’:不能被数列中的其他数所覆盖的数,随后从大到小输出。 在线测试位置:继续(3n+1)猜想
2. 具体实现
2.1 基本思路
- 使用数组,用空间换时间
#define max 10000
int a[max] = {0};
- 数组a中的元素默认值为0:未判定状态,进行判定时会先赋值为1:假定其为关建数,在判定过程中将产生的过程数赋值为-1:标示为非关建数
void judge(int n)
{
if(a[n]==0)
a[n] = 1;
while (n != 1)
{
if (n % 2)//n is odd
{
n = (3 * n + 1) / 2; //过程数
a[n] = -1;
}
else //n is even
{
n = n / 2; //过程数
a[n] = -1;
}
}
return;
}
2.2 AC代码
#include <iostream>
using namespace std;
#define max 10000
short a[max] = {0};
void judge(int n);
int main()
{
int number,value,i=max-1;
cin >> number;
for(int j=0; j <number; j++)
{
cin >> value;
judge(value);
}
while (i--) //打印第一个关建数
{
if (a[i] == 1)
{
cout << i;
break;
}
}
while (i-- >= 1)
if (a[i] == 1)
cout << ' ' << i;
return 0;
}
void judge(int n)
{
if(a[n]==0)
a[n] = 1;
else if(a[n]==-1)
return;
while (n != 1)
{
if (n % 2)//n is odd
{
n = (3 * n + 1) / 2;
a[n] = -1;
}
else //n is even
{
n = n / 2;
a[n] = -1;
}
}
return;
}