PAT乙级1005 继续(3n+1)猜想 (25 分)
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT乙级1005 继续(3n+1)猜想 (25 分)相关的知识,希望对你有一定的参考价值。
https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776
题目给的意思就是说:如果这个数不能被其它数通过那个规律找到那么就是关键字。
方法一: 朴素算法:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1005];
bool b[100005]={false};
int main(void)
{
int n;
int i;
long int temp;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
temp=a[i];
while(temp!=1)
{
if(temp%2==1)
{
temp=(temp*3+1)/2;
b[temp]=true;
}
else
{
temp=temp/2;
b[temp]=true;
}
}
}
sort(a,a+n);
int k=0;
for(i=n-1;i>=0;i--)
{
if(b[a[i]]==false)
k=i;//记录最后一个关键字的下标
}
for(i=n-1;i>=0;i--)
{
if(b[a[i]]==false)
{
printf("%d",a[i]);
if(i!=k)
{
printf(" ");
}
}
}
printf("\\n");
return 0;
}
方法二:精简做法
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int a[105];
bool b[100000];
vector<int> ve;
int main(void)
{
int k; cin>>k;
for(int i=0;i<k;i++)
{
cin>>a[i];
int temp=a[i];
while(temp!=1)
{
if(temp%2==0) temp=temp/2;
else temp=(3*temp+1)/2;
b[temp]=true;
}
}
for(int i=0;i<k;i++){
if(!b[a[i]]) ve.push_back(a[i]);
}
sort(ve.begin(),ve.end());
for(int i=ve.size()-1;i>=0;i--)
{
cout<<ve[i];
if(i!=0) cout<<" ";
}
return 0;
}
方法三:精简做法+优化
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int a[105];
bool b[100000];
vector<int> ve;
int main(void)
{
int k; cin>>k;
for(int i=0;i<k;i++)
{
cin>>a[i];
if(!b[a[i]])//没有出现过
{
int temp=a[i];
while(temp!=1)
{
if(temp%2==0) temp=temp/2;
else temp=(3*temp+1)/2;
if(b[temp]) break;//出现过,说明后面的也都出现过。
b[temp]=true;
}
}
}
for(int i=0;i<k;i++){
if(!b[a[i]]) ve.push_back(a[i]);
}
sort(ve.begin(),ve.end());
for(int i=ve.size()-1;i>=0;i--)
{
cout<<ve[i];
if(i!=0) cout<<" ";
}
return 0;
}
以上是关于PAT乙级1005 继续(3n+1)猜想 (25 分)的主要内容,如果未能解决你的问题,请参考以下文章
JAVA1005 继续(3n+1)猜想 (25分) PAT乙级 PAT (Basic Level)Practice (中文)