//我发现,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; }