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 (中文)

[PAT乙级] Practise 1005 继续(3n+1)猜想

PAT-乙级-1005 继续(3n+1)猜想

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

PAT 1005继续(3n+1)猜想 (25)

PAT 1005 继续(3n+1)猜想 (25)