题解UVA10948 The primary problem

前言

前置

\(\sf{Solution}\)

既然有了 \(n\) ,那找出 \(a\)\(b\) 就只要枚举 \(a\) 的范围 \(1\sim n\),判断 \(a\)\(n-a\) 是否为质数.

因为 \(a\)\(b\) 都不为负数,所以可以缩小枚举范围为 \(1\sim \dfrac{n}{2}\) .

至于判质数,相信欧拉筛能解决问题.

欧拉筛相关请忽略中二部分

\(\sf{Code}\)

#include<iostream>
using namespace std;
int n,ans,prime[5000005];
bool visit[10000005];
int main()
{
	ios::sync_with_stdio(false);
	visit[1]=true;//初始化
	for(int i=2;i<=10000000;++i)
	{
		if(!visit[i])
			prime[++ans]=i;
		for(int j=1;prime[j]*i<=10000000&&j<=ans;++j)
		{
			visit[i*prime[j]]=true;
			if(!(i%prime[j]))
				break;			
		}
	}//欧拉筛
	while(cin>>n&&n!=0)
	{
		bool flag=false;//别忘了初始化
		cout<<n<<":\n";
		for(int i=2; i<=n/2; ++i)
		{
			int a=i,b=n-i;
			if(!visit[a]&&!visit[b])
			{
				cout<<a<<"+"<<b<<"\n";
				flag=true;//有解标记
				break;
			}
		}
		if(!flag)
			cout<<"NO WAY!\n";//无解
	}
	return 0;
}
posted @ 2021-02-16 16:14  Callous_Murder  阅读(50)  评论(0编辑  收藏  举报