PAT_1013_数素数_内存问题

Pi 表示第 i 个素数。现任给两个正整数 MN≤104,请输出 PMPN 的所有素数。

输入格式:

输入在一行中给出 MN,其间以空格分隔。

输出格式:

输出从 PMPN 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

输入样例:

5 27

      
    

输出样例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

解答:(思路简单,使用素数表,主要说一下做题发现的内存问题)

#include <cstdio>

const int MAX = 1e6 + 10;
bool isPrimes[MAX];				//1 代表不是素数,0 代表是素数 

void make_primes()
{
	for(int i = 2;i < MAX;i++)
		if(!isPrimes[i])
			for(int j = i+i;j < MAX;j += i)
				isPrimes[j] = true;			
}

int main()
{
	//初始化 + 读入数据: 
	make_primes();
	int l,r;
	scanf("%d %d",&l,&r);
	
	//处理 + 输出:
	int num = 0;
	int temp = 1;
	for(int i = 2;num < r;i++){
		if(!isPrimes[i]){
			num++;
			if(num >= l&&num <= r){
				if(temp == 1)
					printf("%d",i);
				if(temp == 0)
					printf(" %d\n",i);
				if(temp > 1)
					printf(" %d",i);
				temp = (temp+1)%10;
			}	
		}
	}
	
	return 0;
}

经验:

在通过 oj 时,报出了段错误(我之前定的MAX = 1e4 + 10),是因为自己想当然地将给出的 N 当成了数据范围,而 N 指的是截至到第多少个素数,所以范围一定远大于 10^4。

在发现段错误(我的错误的结果是数组越界)之后,我又想当然的是将全局数组的大小开到最大。因为理论上来说全局数组属于全局变量,最多可以分得几GB,我之前一直将1、2GB认为是比较保守的大小,又因为平时做 oi 基本上开的都是 int 型数组,所以要再除以 4 ,所以我认为开 10^8 次方是没问题的。然而在测评时,我发现我就算开成 10^7 大小还是报了内存超限的错误,所以说有的 oj 的编译器可能并没有给全局区支持很大的空间,这也让我以后尽量开 10^7 以内(保险一点)。

但事实上就算10^8次方都可以开的到,我还是犯了错误,因为题目给的时间限制是200ms,也就是0.2s。因为 2000w 以内的操作数是一定可以保证 1 s内完成,所以要想完成题目要求,要尽量保证操作数在 100w 内,也就是 10^6 内。从这个角度看,我也应该另 MAX = 1e6。所以以后不能觉得自己选的方法高效就大意,不能懒,至少要大致算一下复杂度来估计是否超时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Drdajie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值