【问题标题】:Sorting Fraction? Selection Sort排序分数?选择排序
【发布时间】:2015-12-02 03:06:38
【问题描述】:

有两个名为ArrayFraction 的java 类。 Fraction 类用于表示两个整数的比率。有 accessor(getter) 和 mutators(setter) 方法以及其他允许用户设置分子和分母的方法。还包括一种在屏幕上将分数显示为口粮的方法(例如 5/9)。

Array 类允许用户创建 7 个分数的数组。然后程序将按升序对分数进行排序。然后丢弃最大和最小分数,并将剩余的分数加在一起。该程序应显示所有分数及其总和。总和应减至最低。

假设有7个分数,

  • 6/7、2/4、3/18、1/8、10/20、2/6、3/4。

排序后

  • 1/8、3/18、2/6、2/4、10/20、3/4、6/7

去除最小和最大分数,然后得到其余部分的总和

  • 3/18 + 2/6 + 2/4 + 10/20 + 3/4 = 9/4

我对如何对 Array.java 类中的“分数”进行排序感到困惑。我将其命名为选择排序。同样,我如何丢弃最小和最大的分数?

import java.io.*;
import java.util.*;


public class Array {

    public static void selectionSort(Fraction[] arr)
    {}

    public static void setFraction(Fraction[] arr)
    {
        Scanner scan  = new Scanner(System.in);
        int i=0;
        for (Fraction e : arr)
        {
            i++;
            System.out.println("Input Numerator: " + i + " of 7");
            e.setNumerator(scan.nextInt());

            System.out.println("Input Denominator: " + i + " of 7");
            e.setDenominator(scan.nextInt()); 
        }
    }

    public static Fraction addFraction (Fraction x, Fraction y)
    { 
        int gcd = 0;
        Fraction sum = new Fraction();
        gcd = x.getDenominator() * y.getDenominator();

        sum = new Fraction(x.getNumerator() * y.getDenominator() + 
                x.getNumerator() * y.getDenominator() +  y.getDenominator() * x.getNumerator(), gcd);
        return sum;
    }

    private static final Scanner keyb = null;

    public static void main(String[] args) {
        Fraction fr[] = new Fraction[7];
        String reduce = "";
        Scanner keyb = new Scanner(System.in); 

        for (int i =0; i< fr.length; i++)
            fr[i]=new Fraction();

        Array.setFraction(fr);
        Array.selectionSort(fr);

        Fraction sum = Array.addFraction(fr[0], fr[1]);
        for (int i =0; i <fr.length; i++) {
           fr[i].display();
           if(i<fr.length-1) {
               System.out.print(" + ");
           }

        }

        System.out.print(" = ");
        sum.display();
    }
}

这里是Fraction

import java.io.File;
import java.util.Scanner;


public class Fraction {
    public static int length;
    public int numerator = 1;
    public int denominator = 1;
    public int gcd;
    public Fraction() {
        super ();
    }
    public Fraction(int n, int d) {
        numerator = n;
        denominator = d;
    }
    public void display()
    {
        System.out.print(numerator +"/" + denominator);
    }
    public int getNumerator() {
        return numerator;
    }
    public void setNumerator(int numerator) {
        this.numerator = numerator;
    }
    public int getDenominator() {
        return denominator;
    }
    public void setDenominator(int denominator) {
        this.denominator = denominator;
    }
    private static int gcd(int numerator, int denominator) {
        return denominator == 0 ? numerator : gcd(denominator, numerator % denominator);
    }
    public double decimal(double numerator, double denominator) {
        return numerator / denominator;
    }

    public static void reduce(int numerator, int denominator) {
        int gcd = gcd(numerator, denominator);
        numerator /= gcd;
        denominator /= gcd;
        //return (numerator / gcd) + "/" + (denominator / gcd);
    }

    @Override
    public String toString() {
        return numerator + "/" + denominator;
    }
}

【问题讨论】:

  • 什么是Fraction?它来自哪里?
  • 简而言之,选择排序就是不断迭代数据列表,从列表中取出最大的一个,将其删除并放入一个结果列表。继续这样做,直到清空原始列表。我们可以将原始列表用作“结果列表”(例如,请参见链接)。当然,为了对列表进行排序,您需要能够“比较”两个元素以查看哪个更大。其余的(弄清楚如何比较两个分数,实现排序)是您自己的工作。
  • @chatlover :您提到有 7 个分数。但是在您的示例中,有 6 个。我想 3/4 被遗漏了。并在排序后忽略最小值和最大值并得到其余部分的总和。不是吗?
  • 对不起,是的!这里应该有七个。假设忽略最小值和最大值,然后从其余部分中求和。

标签: java arrays sorting


【解决方案1】:

在使用选择排序之前,您必须执行一些额外的工作,即
1.首先,通过将每个分数乘以某个值,尝试使所有分数的分母相等,即分母的 LCM。
2. 并且,使用相同的值乘以它的分子部分。
3. 之后,第二步你的分母是一样的,所以现在你可以在分子的基础上应用选择排序。 Ans ,也可以通过除以步骤 1 中使用的相应常量值来重新调整值。

【讨论】:

  • 如果您选择七个随机的int 值作为分数的分母,那么它们的 LCM 小到足以放入 int 的可能性有多大?
猜你喜欢
  • 1970-01-01
  • 2013-04-25
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2015-02-14
  • 2013-03-25
相关资源
最近更新 更多