HNUST 1448 有理数的个数 (sort的使用)

题目描述

任何一个有理数都可以表示成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);,可能会有部分地方未初始化,导致排序出现错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值