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

本文探讨了一段C++代码的优化过程,通过限制数组大小避免段错误,改进算法效率。介绍了如何利用静态数表筛选vector中的特定元素,同时修复了vector声明与使用的语法错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值