精简ID号码
Time Limit:2000MS Memory Limit:64000KB
Description
华东师大的学生都有一个唯一的学生编号(SIN). SIN是一个整数(0<= SIN <= 10^6-1), 一位老师觉得这个SIN的范围在他所教授的学生组中太大了. 在每一个小组中,他想要找到一个最小的正整数m, 使得在这个小组中所有的SIN除以m得到的余数是唯一的.
Input
在测试数据的第一行是一个正整数N, 表示有N组测试数据. 每一组测试数据的第一行是一个整数G(1<=G<=300),表示在这个小组中的学生数量. 接下去的G行每一行包含一个SIN. 在每一个小组中的SIN是不同的,虽然不一定是排序的.
Output
对于每一组测试数据,输出一行,包含最小的除数m,使得所有SIN除以m得到的余数是唯一的.
Sample Input
2
1
124866
3
124866
111111
987651
Sample Output
1
8
这道题直接暴力枚举。。。看代码吧。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int n;
int num;
cin >> n;
while(n--)
{
cin >> num;
int *p = new int[num];
for(int i = 0; i < num; ++i)
{
scanf("%d",&p[i]);
}
if(num == 1)//如果只有一个数,直接输出1
{
cout << "1" << endl;
}
else
{
int j;
sort(p,p+num);//从小到大排序,遍历的时候可以减少次数
for(int i = 2; ; ++i)
{
char *visit = new char[i];//余数为从0-i-1
for(int k = 0; k < i; ++k)//初始化
{
visit[k] = 0;
}
for(j = 0; j < num; ++j)//遍历读入的数
{
int m = p[j] % i;
if(visit[m] == 1)//如果有两个数的余数相同,不符合题意,跳出循环
{
break;
}
else
{
visit[m] = 1;//否则的话,标记一下
}
}
if(j == num)//如果遍历完输入的数余数都不相同,则输出。同时跳出循环
{
cout << i << endl;
break;
}
delete[] visit;
}
}
delete[] p;
}
return 0;
}