1005 继续(3n+1)猜想段错误以及解决办法

刚开始的思路和柳神的思路基本一致。代码如下:

#include 
#include
#include 
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 v(k);
	for(int i=0;i>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

这里的思路其实还是不错的。实际上要做的是,从vector中选择符合要求的数据。这里可以总结为一种套路。利用建立一个静态的数表,通过对该静态的数表赋值,从而判断对应的数据是否被选中。核心的语句是“arr[v[i]]”即将数表和vector联系起来了。因为对语法的不熟悉,所以还犯下了其他错误,比如vector声明的时候是(),使用的时候是[]。然而,尴尬的是,上面的代码出现了段错误。段错误,很可能表示超出了内存和索引。这里应当是arr超出了索引,看看式子就知道为什么。柳神的代码为了高效,所以开辟了比较大的空间,这里不这么做,只用对上述代码进行小小的修正即可。即判断n是否大于100,对于大于100的arr根本不管,那么就不用开辟大空间了。

代码如下:
 

#include 
#include
#include 
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 v(k);
	for(int i=0;i>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

over。

你可能感兴趣的:(理论知识,编程记录)