刚开始的思路和柳神的思路基本一致。代码如下:
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int arr[100];
int main() {
int k;
int flag=0;
cin>>k;
vector<int> v(k);
for(int i=0;i<k;i++)
{
cin>>v[i];
int n;
n=v[i];
while(n!=1)
{
if(n%2)
n=(3*n+1);
n=n/2;
arr[n]=1;
}
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<k;i++)
{
if(arr[v[i]]!=1)
{
if(flag==1)cout<<" ";
cout<<v[i];flag=1;
}
}
return 0;
}
这里的思路其实还是不错的。实际上要做的是,从vector中选择符合要求的数据。这里可以总结为一种套路。利用建立一个静态的数表,通过对该静态的数表赋值,从而判断对应的数据是否被选中。核心的语句是“arr[v[i]]”即将数表和vector联系起来了。因为对语法的不熟悉,所以还犯下了其他错误,比如vector声明的时候是(),使用的时候是[]。然而,尴尬的是,上面的代码出现了段错误。段错误,很可能表示超出了内存和索引。这里应当是arr超出了索引,看看式子就知道为什么。柳神的代码为了高效,所以开辟了比较大的空间,这里不这么做,只用对上述代码进行小小的修正即可。即判断n是否大于100,对于大于100的arr根本不管,那么就不用开辟大空间了。
代码如下:
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int arr[102];
int main() {
int k;
int flag=0;
cin>>k;
vector<int> v(k);
for(int i=0;i<k;i++)
{
cin>>v[i];
int n;
n=v[i];
while(n!=1)
{
if(n%2)
n=(3*n+1);
n=n/2;
if(n<101)
arr[n]=1;
}
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<k;i++)
{
if(arr[v[i]]!=1)
{
if(flag==1)cout<<" ";
cout<<v[i];flag=1;
}
}
return 0;
}
over。