题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1078
代码如下:#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int getprime(int n){
if(n==1) return 2;//此处因该返回2,注意1不是素数
else{
int t=sqrt(n);
int i;
for(i=2;i<=t;i++){
if(n%i==0){
for(int j=n+1;;j++){
int tmp=sqrt(j);
int k;
for(k=2;k<=tmp;k++)
if(j%k==0) break;
if(k==tmp+1) return j;
}
}
}
if(i==t+1) return n;
}
return 0;
}
int main()
{
int msize,n;
int a[10001];
bool u[10001];
scanf("%d%d",&msize,&n);
int m=getprime(msize);
for(int i=0;i<m;i++)
u[i]=false;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++){
int tmp=a[i]%m;
if(u[tmp]==false) u[tmp]=true,a[i]=tmp;
else{
int j;
for(j=1;j<=m/2;j++){//m/2次循环,输入和数据处理最好分开写
int temp=(a[i]+j*j)%m;
if(u[temp]==false){
a[i]=temp;
u[temp]=true;
break;
}
}
if(j>m/2) a[i]=-1;
}
}
for(int i=0;i<n-1;i++){
if(a[i]!=-1) printf("%d ",a[i]);
else printf("- ");
}
if(a[n-1]==-1) printf("-\n");
else printf("%d\n",a[n-1]);
return 0;
}