//我发现,sqrt用c++提交会CE
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int Prim( int n)
{
int i=2,cnt=0;
while(n>0&&n>=i)//防止发生除0错误,因为可能素数还不够50
{
if(n%i==0)
{
cnt++;
while(n%i==0)
//不会死循环因为n最终为1,则跳出内部while
n/=i;
}
i++;
}
return cnt;
}
int main()
{
int i,j,k,T;
cin>>T;
char name[21];
int number;
while(T--)
{
char str[] = "ZZZZZZZZZZZZZZZZZZZZZ";
int count = 0;
int num,cnt=0;
cin>>num;
for(i=0;i<num;i++)
{
cin>>name;
cin>>number;
cnt = Prim(number);
if(cnt>count||cnt==count&&strcmp(name,str)<0)
{
count = cnt;
strcpy(str,name);
}
}
cout<<str<<endl;
}
return 0;
}
//wa,
#include <iostream>
#include <string>
#include <cstring>
#include <malloc.h>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef struct INFO
{
char str[21];
int number;
int cnt;//质因子个数
}INFO;
int Prim( int n)
{
int i=2,cnt=0;
while(n>0&&n>=i)//防止发生除0错误,因为可能素数还不够50
{
if(n%i==0)
{
cnt++;
while(n%i==0)
n/=i;
}
i++;
}
return cnt;
}
/*这样的cmp会wa ,因为前者大于后者时,会倒过来
int cmp(const void *a,const void *b)
{
if(((INFO *)a)->cnt!=((INFO *)b)->cnt)
return (*(INFO *)a).cnt<(*(INFO *)b).cnt;
else
return strcmp(((INFO *)a)->str,((INFO *)b)->str);
}
*/
//这样的cmp也会wa
int cmp(const void *a,const void *b)
{
if(((INFO *)a)->cnt<((INFO *)b)->cnt)
return (*(INFO *)a).cnt<(*(INFO *)b).cnt;
else if(((INFO *)a)->cnt>((INFO *)b)->cnt)
return 0;
else
return strcmp(((INFO *)a)->str,((INFO *)b)->str);
}
int main()
{
int i,j,k,T;
cin>>T;
while(T--)
{
int num;
cin>>num;
//原来只申请了一个节点,总提示 内存不可写,这么低级的错误
INFO *info = (INFO *)malloc(sizeof(INFO)*(num+3));
for(i=0;i<num;i++)
{
cin>>info[i].str;
cin>>info[i].number;
}
for(i=0;i<num;i++)
{
info[i].cnt = Prim(info[i].number);
//cout<<info[i].cnt<<endl;
}
qsort(info,num,sizeof(INFO),cmp);
cout<<info[1].str<<endl;
}
return 0;
}