1. 程式人生 > >JXUFE紫書第三章例題 Prime Factors

JXUFE紫書第三章例題 Prime Factors

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;
}