多解需要SPJ
入门:
题目:给出一个不小于12的正整数n,请你输出两个合数,使他们的和等于n,注意,每个测试,有多组测试数据.
比赛目录如下:
标准输入输出数据如下:
sum1.in
2
12
13
sum1.ans
6 6
4 9
样例1说明如下:
2表示有2组输入数据
12=4+8,12=6+6,12=8+4很明显,有3种答案
13=4+9,13=9+4很明显,有2种答案
因存在多解,故输出的sum1.ans在此题中,无用,只是给编程者看看,具体判定结果对错与否,无用,判定结果需SPJ。
sum2.in
2
14
15
sum2.ans
6 8
6 9
sum3.in
2
16
17
sum3.ans
6 10
8 9
sum4.in
2
18
19
sum4.ans
9 9
9 10
sum5.in
2
20
21
sum5.ans
10 10
6 15
用户程序(sum.cpp)如下:
#include <bits/stdc++.h>
using namespace std;
int is_prime(int x){//质数,返回1;合数,返回0;不是质数,也不是合数,返回2
if(x==1)return 2;//不是质数,也不是合数.
if(x==2)return 1;
for(int i=2;i*i<=x;i++)
if(x%i==0)return 0;
return 1;
}
int main(){
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
int T,n,a,b;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(a=4;a<n;a++){
b=n-a;
if(is_prime(a)==0&&is_prime(b)==0){
printf("%d %d\n",a,b);
break;
}
}
}
return 0;
}
SPJ代码(chk.cpp)如下:
#include <bits/stdc++.h>
using namespace std;
int is_prime(int x){//质数,返回1;合数,返回0;不是质数,也不是合数,返回2
if(x==1)return 2;//不是质数,也不是合数.
if(x==2)return 1;
for(int i=2;i*i<=x;i++)
if(x%i==0)return 0;
return 1;
}
int main(int argc,char *argv[]){
FILE * f_in=fopen(argv[1],"r");//标准输入
FILE * f_out=fopen(argv[2],"r");//用户输入
FILE * f_std=fopen(argv[3],"r");//标准输出
int score=atoi(argv[4]);//单个测试点分值
FILE * f_score=fopen(argv[5],"w");//得分文件
FILE * f_report=fopen(argv[6],"w");//报告文件
int ret=1;//结果正确
int T,n,a,b;
fscanf(f_in,"%d",&T);//多组测试数据
while(T--){
fscanf(f_in,"%d",&n);
fscanf(f_out,"%d%d",&a,&b);
if(a+b!=n || is_prime(a)!=0 || is_prime(b)!=0)//和不等于n;a,b不是合数
ret = 0;//结果错误
}
if(ret==1)fprintf(f_report,"AC"),fprintf(f_score,"%d",score);
else fprintf(f_report,"WA"),fprintf(f_score,"%d",0);
fclose(f_in);
fclose(f_out);
fclose(f_std);
fclose(f_score);
fclose(f_report);
return 0;
}
未加SPJ,测评如下:
加SPJ(将chk.cpp编译后的chk.exe文件放于spj2\data\sum\目录中,详见本文开始部分的比赛目录),测评如下: