1005 繼續(3n+1)猜想段錯誤以及解決辦法

剛開始的思路和柳神的思路基本一致。代碼如下:

#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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章