您的位置:首页 > 其它

pat 乙级 1005 继续(3n+1)猜想 (25)

2017-09-03 13:45 239 查看


思路就是 定义一个数组 用来标记 每一个递推过程中出现的每一个数字是否出现过 ,出现标记为1;

具体看代码:

#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>

using namespace std;

int c[100000]={0}; // 注意 这里不要开小了 ..一开始发生断错误就是开小了
int main()
{
int N;
cin>>N;
int a
;
int kong=0,num; // 用来格式输出的
for (int i = 0; i < N; ++i)
{
cin>>num;
a[i]=num;
if (a[i]==1) continue;
if (c[num]==0) // 如果未被标记过
{
while (num!=1) {

if (num%2==0)
{
num=num/2;
c[num]++; // 标记为1
}
else {
num=(3*num+1)/2;
c[num]++; // 标记为1
}
}
}
}
sort(a,a+N); // 题目要求 从大到小输出 所以排序 。然后倒着遍历
for (int i=N-1;i>=0;i--) {
if (a[i]==1) // 1 肯定是关键数
{
if (kong>0)
{
cout<<" "; // 这里
a086
是一个格式输出 下面同理
}
cout<<"1";
kong++;

}
else if (c[a[i]]==0) // 如果没被标记过 输出即可
{ if (kong>0)
{
cout<<" ";
}
cout<<a[i];
kong++;
}
}
return 0;
}

AC图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: