题目
解题思路
最简单直接的想法,将输入的所有数的覆盖均求出,再与覆盖比较,得到不在覆盖中的关键数再进行排序输出。
注意:
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];
}
}