1448: 有理数的个数
时间限制: 2 Sec 内存限制: 64 MB
提交: 421 解决: 65
[提交][状态][讨论版]
题目描述
任何一个有理数都可以表示成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
提示
来源
CYH
来源: http://acm.hnust.edu.cn/JudgeOnline/problem.php?id=1448
2.相同的分子(分母)小放前面
#include<stdio.h>
#include<stdlib.h>
int gcd(int a, int b)
{ return b == 0 ? a : gcd(b, a % b); }
typedef struct{
long long a;
long long b;
double x;
}Con;
Con num[100001];
int cmp(const void *a,const void *b)
{
if((*(Con *)a).x-(*(Con *)b).x)
return (*(Con *)a).x>(*(Con *)b).x?1:-1;
else
return -(*(Con *)a).a+(*(Con *)b).a;
}
int main(void)
{
int n,T;scanf("%d",&T);
while(T--)
{
int count=1,T=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%*c%lld",&num[i].a,&num[i].b);
num[i].x=(double)num[i].a/(double)num[i].b;
}
qsort(num+1,n,sizeof(num[0]),cmp);
for(int i=1;i<n;i++)
if(num[i].x!=num[i+1].x) T++;
printf("%d\n",T);
for(int i=1;i<=n;i++)
{
if(num[i].x==num[i+1].x) count++;
else
{
int z=gcd(num[i].a,num[i].b);
num[i].b/=z;num[i].a/=z;
printf("%lld/%lld %d\n",num[i].a,num[i].b,count);
count=1;
}
}
}
}