PAT乙级(Basic)题库---1005

题目

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

解题思路

最简单直接的想法,将输入的所有数的覆盖均求出,再与覆盖比较,得到不在覆盖中的关键数再进行排序输出。
注意:

1.memset函数需要头文件string.h支持,sort函数需要头文件algorithm支持。
2.memset函数对int数组的初始化只能为0或-1,因为memset函数是以字节为单位进行初始化内存的,0的二进制全为0,-1的二进制全为1,因此对4字节的int可以被初始化为0或-1。

代码

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;

//用use数组记录是否被覆盖,下标表示该数,0表示未被覆盖,1表示被覆盖
int use[105];

//得到num覆盖的数,并将其改为被覆盖
void test(int num)
{
    int temp;
    if(num==1)
        {
            return;
        }
    else if(num%2)
        {
        temp=(3*num+1)/2;
        }
    else 
        {
        temp=num/2;
        }

    //防止得到数越界,输入的数小于等于100,只判断100以内的是否被覆盖,超过的数不考虑
    if(temp<101)
    {
            use[temp]=1;
    }
        test(temp);
}

//排序规则,用来给sort进行降序排序
bool comp(int a,int b)
{
    return a>b;
}
int main()
{
    //len记录关键数的个数
    int n,len=0;

    //input数组记录输入的数,import数组记录关键数,输入的数不会多余100
    int input[105],import[105];

    //初始化是否被覆盖,开始时均未被覆盖
    memset(use,0,sizeof(use));
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>input[i];
        test(input[i]); 
    }
    for(int i=0;i<n;i++)
    {
        //判断输入的数是否被覆盖,即是否是关键数
        if(use[input[i]]!=1)
        {
            import[len]=input[i];
            len++;
        }
    }

    //降序排序
    sort(import,import+len,comp);
    cout<<import[0];
    for(int i=1;i<len;i++)
    {
        cout<<" "<<import[i];
    }   
}

猜你喜欢

转载自blog.csdn.net/h928066986/article/details/75024503