JXUFE紫书第三章例题 Prime Factors

该博客介绍了处理素数筛法的一个实例,涉及如何避免数组越界错误。文章指出,在计算中只需要筛选到平方根,并提醒不能直接检查大于sqrt(2^31-1)的数是否为素数,以防止运行时错误(RE)。同时,讨论了特殊情况的处理与代码简洁性的权衡。

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

int ms =(int)sqrt(2^31-1)+1;

cin>>x;//x 是输入的数

0.打表

1.不用保存大于 ms 的素数,后期绕晕了。 记得筛选素数的时候到i*i<=x就行了。

2.不能直接判断x是不是在isprime里面,否则会造成RE,因为isprime[x>ms]会造成数组越界。

3.有时候直接判断特殊情况可以减少工作量,但会牺牲代码简洁性(便于查错)。

4.细节处理
……

#include<bits/stdc++.h>
using namespace std;
#define MAXN 47000
int su[MAXN];
bool isprime[MAXN];
int cnt=1;
//获得素数 
void getp()
{
	int i,j;
	
	isprime[0]=isprime[1]=0;
	for(i=2;i<MAXN;i++)
	{
		if(isprime[i])
		su[cnt++]=i;
		for(j=1;j<cnt&&su[j]*i<MAXN;j++)
		{
			isprime[su[j]*i]=0;
		}
	}
}
int main()
{
	int i;
	for(i=0;i<MAXN;i++)
	{
		isprime[i]=1;
	}
	getp();
	int x;
	//当有输入并且输入不为0时 
	while(~scanf("%d",&x)&&x)
	{
		int first=1;
		printf("%d =",x);
		//x是负数就先输出-1,并取反,置first=0 
		if(x<0)
		{
			x=-x;
			printf(" -1",x);
			first=0;
		}
		//如果有的除,就一直除;如果除到1,分解完毕 
		for(i=1;i<cnt;)
		{
			if(x==1) break;
			if(x%su[i]==0)
			{
				if(first)
				{
					first=0;
					printf(" %d",su[i]);
					
				}
				else	
					printf(" x %d",su[i]);
				x/=su[i];
			}
			else
			{
				i++;
			}
		}
		//如果经过前面的还没被除到一,说明这是一个很大的素数(大于2^31-1的平方根) 
		if(x!=1)
		{
			if(first) printf(" %d",x);
			else printf(" x %d",x);
		}
	
		cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值