UVA - 10852
题目介绍:
Let n be an integer, 100 ≤ n ≤ 10000, find the prime number x, x ≤ n, so that n − p ∗ x is maximum,
where p is an integer such that p ∗ x ≤ n < (p + 1) ∗ x.
大意:
求素数X,在满足P*X<=N<(P+1)X时,使N-PX最大。
构造素数表,从大往小试,测试了一个之后,假设余数是K,所有小于K的素数都不符合,因为小于K的素数求得的结果必定小于K。
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int ss[10005],vis[10005];
int pos=0;
void init(){
for(int i=2;i<=10000;i++){
if(!vis[i]){
ss[pos++]=i;
for(int j=i*2;j<=10000;j+=i)
vis[j]=1;
}
}
}
int main(){
init();
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int ans=0,Maxn=0;
for(int i=pos-1;i>=0&&ss[i]>Maxn;i--){
if(ss[i]<n){
int k=n%ss[i];
if(k>Maxn){
Maxn=k;
ans=i;
}
}
}
cout<<ss[ans]<<endl;
}
return 0;
}