剛開始的思路和柳神的思路基本一致。代碼如下:
#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。