zoukankan      html  css  js  c++  java
  • PTA顺序的分数

    PTA顺序的分数

    题目

    题目描述

    输入一个自然数 n,对于一个最简分数 a/b(分子和分母互质的分数),满足 1≤b≤n,0≤a/b≤1,请找出所有满足条件的分数,并按分数值递增的顺序输出这些分数。

    输入格式:

    输入一个正整数 n(1≤n≤160)。

    输出格式:

    每个分数单独占一行,按照分数值递增的顺序排列。

    输入样例:

    5
    

    输出样例:

    0/1
    1/5
    1/4
    1/3
    2/5
    1/2
    3/5
    2/3
    3/4
    4/5
    1/1
    

    注: 1、0 和任意自然数的最大公约数就是那个自然数。 2、互质指最大公约数等于1的两个自然数。

    思路

    • 将没问题的点压入数组
      • 不能直接取余,要用辗转相除法(比如4和6)
    • 对数组进行特殊的排序
      • 可以优化,不用特地计算它们的商,而是通过移项的方式构造出不等式来进行判断。
    • 优化:
      • 变长数组,省点空间
      • 预处理:先压特殊点进去,0和1,1和1;

    代码

    原始代码

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<math.h>
    using namespace std;
    typedef struct{
         double x,y;
    }nod;
    nod node[40000];
    int cnt=0;
    bool cmp(nod a,nod b)
    {
    	double ad=a.x/a.y;
    	double bd=b.x/b.y;
    	return ad<bd;
    }
    int gcd(int a,int b)
    {
    	if(a%b==0)
    	{
    		return b;
    	}
    	else
    	{
    	     return gcd(b,a%b);	
    	}
    }
    int main()
    {
    	int n;
    	int i,j;
    	int cx,cy;
    	node[0].x=0;
    	node[0].y=1;
    	node[1].x=1;
    	node[1].y=1;
    	cnt=1;
    	cin>>n;
    	for(i=2;i<=n;i++)
    	{
    		for(j=1;j<i;j++)
    		{
    			if(gcd(i,j)==1||j==1)
    			{
    				cnt++;
    				node[cnt].x=j;
    				node[cnt].y=i;			
    			}
    		}
    	}
    	sort(node,node+cnt+1,cmp);
    	for(i=0;i<=cnt-1;i++)
    	{
    		cout<<node[i].x<<"/"<<node[i].y<<endl;
    	}
    	cout<<node[cnt].x<<"/"<<node[cnt].y;
        return 0;
    }
    

    稍微改进

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>//sort
    #include<string.h>
    #include<vector>//变长数组 
    #include<math.h>
    using namespace std;
    typedef struct{
         int x,y;
    }node;
    vector <node > nodes;
    int cnt=0;
    bool cmp(node a,node b)
    {
    	return a.x*b.y<b.x*a.y;
    }
    int gcd(int a,int b)
    {
    	if(a%b==0)
    		return b;
    	else
    	    return gcd(b,a%b);	
    }
    int main()
    {
    	int n;
    	int i,j;
    	int cx,cy;
        nodes.push_back(node{0,1});
        nodes.push_back(node{1,1});
    	cin>>n;
    	for(i=2;i<=n;i++)
    	{
    		for(j=1;j<i;j++)
    		{
    			if(gcd(i,j)==1||j==1)
    			{
    			    nodes.push_back(node{j,i});
    			}
    		}
    	}
    	sort(nodes.begin(),nodes.end(),cmp);
    	for(i=0;i<nodes.size();i++)
    		cout<<nodes[i].x<<"/"<<nodes[i].y<<endl;
        return 0;
    }
    

    变长数组

    • 变长数组名.size():返回元素的个数;
    • 变长数组名.begin():返回起始位置;
    • 变长数组名.end():返回终点位置;

    参考资料

    jrxjs——pta顺序的分数

  • 相关阅读:
    socket使用大全
    UIImageView控件使用(转)
    多线程,socket,http,asihttpRequest,等总结集合
    ios 如何判断字符串含有中文字符?
    修改UISearchBar
    abc222_e Red and Blue Tree(树上差分+01背包)
    2020icpc上海部分题解
    abc215_e Chain Contestant(状压dp)
    bzoj3238 差异(后缀数组+单调栈)
    NCD2019部分题解
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/14477744.html
Copyright © 2011-2022 走看看