题目描述
任何一个有理数都可以表示成M/N的形式(M,N均为正整数)。例如1/2,2/4,3/6都是等值的有理数。给定若干有理数,等值有理数的值只能算一个,问这些有理数含有多少个值,并按从小到大输出各值及该值的有理数个数。
输入
第一行是整数n,表示随后有n组测试数据(n不超过10)。
每一组测试数据的第一行是一个整数m(m<=100000),随后有m行,每一行都是A/B的形式, 1<=A,B<=1000000000
输出
对于每一组测试数据,输出要求如下,第一行输出有理数值的个数p,随后的p行按从小到大的次序每一行输出一个A/B形式的值及其对应的有理数个数,用空格分开,要求A/B是最简分数。
样例输入
2
2
1/3
1/4
4
1/1
1/2
7/14
7/7
样例输出
2
1/4 1
1/3 1
2
1/2 2
1/1 2
#include<cstdio>
int main()
{
long long n;
while(scanf("%lld",&n)==1) //long long 输入避免出错
{
long long temp,i,num;
for(i=2;i<=850;i++) //850*850*850>2^31
{
long long a=i*i*i;
if(n%a!=0) //若不是整数则跳过
continue;
temp=n/a;
long long left=2,right=temp,mid;
while(left<=right) // 二分查找
{
mid=(left+right)/2;
num=mid*mid;
if(num>=temp)
right=mid-1;
else
left=mid+1;
}
if(left*left==temp&&left!=i) //确定p.q不是同一个整数
break;
}
if(i<=850)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
反思:sort函数使用的时候要注意其用法规范性,sort(stu,stu+m,cmp);,可能会有部分地方未初始化,导致排序出现错误