1. 程式人生 > >hpuoj【1070】Welcome to HPU Online Judge!【素數拆分】

hpuoj【1070】Welcome to HPU Online Judge!【素數拆分】

1070: Welcome to HPU Online Judge! [水題]

時間限制: 1 Sec 記憶體限制: 128 MB  Special Judge

提交: 157 解決: 43 統計

題目描述

Today, CZY gives you a positive integer N, now he wants to find two different prime numbers a and b for N = a + b.

輸入

The first line contains only one integer T,  which indicates the number of test cases.

For each test case contains a positive integer N.

Data range:1 <= T <= 100, 1 <= N <= 1000.

輸出

For each test case, if the answer doesn't exist then print "-1"(without quotes).

Otherwise, you can output a b in any order, but must be separated with a space.

If there are multiple solutions, print any of them.

樣例輸入

2
5
6

樣例輸出

2 3
-1
解析:
    把一個整數拆分成兩個不同素數的和,如果有多組解,輸出任意一個(第一組資料輸出3 2也正確),無解輸出-1
程式如下:
#include<cstdio>
int Prime(int n)
{
	int flag=0;
	for(int i=2; i*i<=n; i++)
	{
		if(n%i==0)
		{
			flag=1;
			break;
		}
	}
	if(flag==1||n==1)
	   return 0;
	return 1;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		int flag=0;
		scanf("%d",&n);
		int a,b;
		for(int i=2; i<n; i++)
		    for(int j=i+1; j<n; j++)
		    {
		    	if(i+j==n&&Prime(i)&&Prime(j))
		    	{
		    		flag=1;
		    		a=i;
		    		b=j;
					break;
				}
			}
		if(flag==0)
		   printf("-1\n");
		else
		   printf("%d %d\n",a,b);
	}
	return 0;
}
ps:如果要求輸出所有的結果,可以參考下面的程式碼
#include<cstdio>
int Prime(int n)
{
	int flag=0;
	for(int i=2; i*i<=n; i++)
	{
		if(n%i==0)
		{
			flag=1;
			break;
		}
	}
	if(flag==1||n==1)
	   return 0;
	return 1;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		int flag=0;
		scanf("%d",&n);
		for(int i=2; i<n; i++)
		    for(int j=i+1; j<n; j++)
		    {
		    	if(i+j==n&&Prime(i)&&Prime(j))
		    	{
		    		flag=1;
		    		printf("%d %d\n",i,j);
		    		break;
				}
			}
		if(flag==0)
		   printf("-1\n");
	}
	return 0;
}