有理数个数
#include <stdio.h>
#include <algorithm>
typedef long long ll;
using namespace std;
struct fenshi {
int a, b;
double c;
};
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
int cmp(fenshi p, fenshi q) { return p.c < q.c; }
int main()
{
int t, i, n, x, y, gg, j, k;
fenshi arr[100100];
scanf("%d", &t);
while (t--) {
int num = 1, c = 1;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d/%d", &x, &y);
gg = gcd(x, y);
arr[i].a = x / gg;
arr[i].b = y / gg;
arr[i].c = (arr[i].a)*1.0 / (arr[i].b)*1.0;//一定要乘1.0不然c变量可能相同
} //导致排序出问题
sort(arr, arr + n, cmp);
for (int k = 1; k < n; k++) {
if ((arr[k].a != arr[k - 1].a) || (arr[k].b != arr[k - 1].b))
num++;
}
printf("%d\n", num);
for (j = 1; j < n; j++) {
if (arr[j].a == arr[j - 1].a &&arr[j].b == arr[j - 1].b) {
c++;
} else {
printf("%d/%d ", arr[j - 1].a, arr[j - 1].b);
printf("%d\n", c);
c = 1;
}
}
printf("%d/%d %d\n", arr[j - 1].a, arr[j - 1].b,c);
}
return 0;
}