这道题主要是小细节要把握,实际难度不大
机翻
1、条件准备
表大小,输入数据数
#include <iostream>
#include<vector>
#include<cmath>
using namespace std;
#define endl '\n'
int Size,n;
2、主函数
先输入数据,用isprime判断是否为质数直到Size变为质数。初始化表H
然后循环调用judge判断每个元素应输出什么,最后单独判断一次不输出空格
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>Size>>n;
while(isprime(Size)==0)
Size++;
vector<int> H(Size,-1);
while(--n)
{
judge(H);
cout<<' ';
}
judge(H);
return 0;
}
3、isprime函数
试除法判断质数
bool isprime(int num)
{
if(num<2)return false;
for(int i=2;i<=num/i;i++)
if(num%i==0)return false;
return true;
}
4、judge函数
输入值,算起始位置,没插过则插入。
否则用二次探测法,bios为正的偏置,f判断是否要输出-
如果探测次数超过了表的大小则取消探测。
void judge(vector<int>& H)
{
int cur;cin>>cur;
int idx=cur%Size;
if(H[idx]==-1)
{
H[idx]=cur;cout<<idx;
return;
}
int bios=1;int f=0;
while(1)
{
if(sqrt(bios)>=Size)break;
if(H[(idx+bios)%Size]==-1)
{
H[(idx+bios)%Size]=cur;cout<<(idx+bios)%Size;
f=1;
break;
}
bios=(sqrt(bios)+1);bios*=bios;
}
if(!f)cout<<'-';
}
5、总结
这道题难度不大,主要是处理小细节,只有正增量,什么时候不探测
完整代码如下
#include <iostream>
#include<vector>
#include<cmath>
using namespace std;
#define endl '\n'
int Size,n;
bool isprime(int num)
{
if(num<2)return false;
for(int i=2;i<=num/i;i++)
if(num%i==0)return false;
return true;
}
void judge(vector<int>& H)
{
int cur;cin>>cur;
int idx=cur%Size;
if(H[idx]==-1)
{
H[idx]=cur;cout<<idx;
return;
}
int bios=1;int f=0;
while(1)
{
if(sqrt(bios)>=Size)break;
if(H[(idx+bios)%Size]==-1)
{
H[(idx+bios)%Size]=cur;cout<<(idx+bios)%Size;
f=1;
break;
}
bios=(sqrt(bios)+1);bios*=bios;
}
if(!f)cout<<'-';
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>Size>>n;
while(isprime(Size)==0)
Size++;
vector<int> H(Size,-1);
while(--n)
{
judge(H);
cout<<' ';
}
judge(H);
return 0;
}