Java:将整数数字从大到小排序

Java: Sorting integer digits from greatest to least

我需要帮助仅使用 if 语句而不使用 String/Arrays 或任何类似的东西来对整数数字从大到小进行排序。 假设我已经初始化并导入了 Scanner 和键盘以允许输入。我遇到的问题是 if 语句,因为我似乎无法正确处理。请帮忙,过去 5 个小时我一直在努力解决这个问题。谢谢:)

    System.out.print("Enter a five digit integer number: ");

    int fiveInt, digit1, digit2, digit3, digit4, digit5; //Declaring variables

    Scanner keyboard = new Scanner (System.in);

    fiveInt = keyboard.nextInt(); //User input will be required



    System.out.println(" "); //Prints empty line


    //The following will be explained assuming number entered was 12345.
    //The (int) will change whatever result of the division taking place to an integer.

    digit1 = (int)(fiveInt / 10000); //12345 divided by 10000 = 1.2345 converted to 1 due to (int).
    digit2 = ((int)(fiveInt / 1000)) - (digit1 * 10); //12345 divided by 1000 = 12.345 - (1 * 10) = 2.345 converted 2 due to (int).
    digit3 = ((int)(fiveInt / 100)) - (digit1 * 100) - (digit2 * 10); //12345 divided by 100 = 123.45 - (1*100) - (2*10) = 3.45 converted to 3 due to (int).
    digit4 = ((int)(fiveInt / 10)) - (digit1 * 1000) - (digit2 * 100) - (digit3 * 10); //12345 divided by 10 = 1234.5 - (1*1000) - (2*100) - (3*10) = 4.5 converted to 4 due to (int).
    digit5 = fiveInt - (digit1 * 10000) - (digit2 * 1000) - (digit3 * 100) - (digit4 * 10); //12345 - (1*10000) - (2*1000) - (3*100) - (4*10) = 5



    System.out.println("The digits in " + fiveInt + " are: " + digit1 + ", " + digit2 + ", " + digit3 + ", " + digit4 + ", " + digit5);

    System.out.println(" "); //Prints empty line




    //Insert explanation for lines of code below here.



    if(digit1 < digit2){
      int a = digit1;
      digit1 = digit2;
      digit2 = digit1;
    }

    if(digit1 < digit3){
      int b = digit1;
      digit1 = digit3;
      digit3 = digit1;
    }

    if(digit1 < digit4){
      int c = digit1;
      digit1 = digit4;
      digit4 = digit1;
    }

    if(digit1 < digit5){
      int d = digit1;
      digit1 = digit5;
      digit5 = digit1;
    }




    //Insert explanation for lines of code above here.





    System.out.print("The largest number with these digits is: " + digit1 + digit2 + digit3 + digit4 + digit5); //Displays the digits in their sorted mann

第一个错误是您没有恢复临时存储在 abc...而不是

中的变量
if(digit1 < digit2){
      int a = digit1;
      digit1 = digit2;
      digit2 = digit1;
    }

你可能想要:

if(digit1 < digit2){
      int a = digit1;
      digit1 = digit2;
      digit2 = a;
    }

无论如何,这还不够,因为算法不会 'sort' 这五个变量。使用此代码,您只需将最大数字存储在 digit1.

如果你想要真正的排序,最简单的方法是将整数放入数组中并使用 Arrays.sort()

对其进行排序

另外,你的最后一行代码:

System.out.print("The largest number with these digits is: " + digit1 + digit2 + digit3 + digit4 + digit5);

不会打印排序的整数,而是数字的总和(在您的示例中为 15)

您需要定义 5 项,例如 a1、a2、a3、a4、a5,然后找到最大或最小的排序项

这是我想出的。基本思想是找到最小的数字,然后使这个数字无效。不幸的是,这意味着原始数字数据丢失了,但您始终可以从用户输入中恢复它 int:

int currentMin;

System.out.print("The largest number with these digits is: ");

while(true) {
  currentMin = Math.min(digit1, Math.min(digit2, Math.min(digit3, Math.min(digit4, digit5))));
  //Invalidate the min digit
  if (currentMin == digit1) digit1 = Integer.MAX_INT;
  if (currentMin == digit2) digit2 = Integer.MAX_INT;
  if (currentMin == digit3) digit3 = Integer.MAX_INT;
  if (currentMin == digit4) digit4 = Integer.MAX_INT;
  if (currentMin == digit5) digit5 = Integer.MAX_INT;
  if (currentMin == Integer.MAX_INT) {
    break;
  } else {
    System.out.print(currentMin + " ");
  }
}

这是对我刚刚写的内容的阐述。基本上你必须得到 5 个整数(a1 到 a5)和 returns 排序的值。我先找到顺序。例如在下面的测试数据中,7 是第 3 项。然后将 7 和其他人按照我提到的从 a1 到 a5 的预定义整数的适当顺序打印出来 ...

public class B{

static int a1, a2, a3, a4, a5;

static int digit1=4;
static int digit2=1;
static int digit3=7;
static int digit4=9;
static int digit5=5;

public static void main(String args[]) {


    setDigitOrer(digit1, getOrder(digit1, digit2, digit3, digit4, digit5));
    setDigitOrer(digit2, getOrder(digit2, digit1, digit3, digit4, digit5));
    setDigitOrer(digit3, getOrder(digit3, digit2, digit1, digit4, digit5));
    setDigitOrer(digit4, getOrder(digit4, digit2, digit3, digit1, digit5));
    setDigitOrer(digit5, getOrder(digit5, digit2, digit3, digit4, digit1));


    System.out.println(a1 );
    System.out.println(a2 );
    System.out.println(a3 );
    System.out.println(a4 );
    System.out.println(a5 );

}

private static void setDigitOrer(int digit, int digitOrder) {
    if (digitOrder == 0){
        a1 = digit;
    } else if (digitOrder == 1){
        a2 = digit;
    } else if (digitOrder == 2){
        a3 = digit;
    } else if (digitOrder == 3){
        a4 = digit;
    } else if (digitOrder == 4){
        a5 = digit;
    }

}

private static int getOrder(int digit, int... digits){
    int count = 0;
    for (int d: digits){
        if (d > digit){
            count++;
        }
    }
    return count;
}

}

结果是 9 7 5个 4个 1

这绝对是作业,规则不是很清楚。但是,我确信该解决方案不包括对 Math.min 或 Math.max 方法的 4 次调用。动动脑筋,查找一些排序算法并尝试实现一个。

使用以下 python 小程序:

for pos in range(1,5):
    for num in range(1,6-pos):
        print "if (digit%d < digit%d) {" % (num, num+1)
        print "\tSystem.out.println(\"Swapping \"+digit%d+\" and \"+digit%d);" % (num, num+1)
        print "\tint temp=digit%d;" % (num)
        print "\tdigit%d=digit%d;" % (num, num+1)
        print "\tdigit%d=temp;" % (num+1)
        print "}"

它将生成 java 代码,您可以在这些注释之间插入代码

//Insert explanation for lines of code below here.

它将对您的五位数字进行排序。基本上它 bubble sort 展开两个循环。

不要浪费时间手动输入排序语句。确实存在计算机来为我们完成无聊的工作!

if (digit1 < digit2) {
    System.out.println("Swapping "+digit1+" and "+digit2);
    int temp=digit1;
    digit1=digit2;
    digit2=temp;
}
if (digit2 < digit3) {
    System.out.println("Swapping "+digit2+" and "+digit3);
    int temp=digit2;
    digit2=digit3;
    digit3=temp;
}
...
    System.out.print("Enter a five digit integer number: ");

    int fiveInt, digit1, digit2, digit3, digit4, digit5; // Declaring
                                                            // variables

    Scanner keyboard = new Scanner(System.in);

    fiveInt = keyboard.nextInt(); // User input will be required

    System.out.println(" "); // Prints empty line

    // The following will be explained assuming number entered was 12345.
    // The (int) will change whatever result of the division taking place to
    // an integer.

    digit1 = (int) (fiveInt / 10000); // 12345 divided by 10000 = 1.2345
                                        // converted to 1 due to (int).
    digit2 = ((int) (fiveInt / 1000)) - (digit1 * 10); // 12345 divided by
                                                        // 1000 = 12.345 -
                                                        // (1 * 10) = 2.345
                                                        // converted 2 due
                                                        // to (int).
    digit3 = ((int) (fiveInt / 100)) - (digit1 * 100) - (digit2 * 10); // 12345
                                                                        // divided
                                                                        // by
                                                                        // 100
                                                                        // =
                                                                        // 123.45
                                                                        // -
                                                                        // (1*100)
                                                                        // -
                                                                        // (2*10)
                                                                        // =
                                                                        // 3.45
                                                                        // converted
                                                                        // to
                                                                        // 3
                                                                        // due
                                                                        // to
                                                                        // (int).
    digit4 = ((int) (fiveInt / 10)) - (digit1 * 1000) - (digit2 * 100)
            - (digit3 * 10); // 12345 divided by 10 = 1234.5 - (1*1000) -
                                // (2*100) - (3*10) = 4.5 converted to 4 due
                                // to (int).
    digit5 = fiveInt - (digit1 * 10000) - (digit2 * 1000) - (digit3 * 100)
            - (digit4 * 10); // 12345 - (1*10000) - (2*1000) - (3*100) -
                                // (4*10) = 5

    System.out
            .println("The digits in " + fiveInt + " are: " + digit1 + ", "
                    + digit2 + ", " + digit3 + ", " + digit4 + ", "
                    + digit5);

    System.out.println(" "); // Prints empty line

    // Insert explanation for lines of code below here.

    if (digit1 < digit2) {
        int a = digit1;
        digit1 = digit2;
        digit2 = a;
    }

    if (digit2 < digit3) {
        int b = digit2;
        digit2 = digit3;
        digit3 = b;
    }

    if (digit3 < digit4) {
        int c = digit3;
        digit3 = digit4;
        digit4 = c;
    }

    if (digit4 < digit5) {
        int d = digit4;
        digit4 = digit5;
        digit5 = d;
    }

    // 2nd Filtering

    if (digit1 < digit2) {
        int a = digit1;
        digit1 = digit2;
        digit2 = a;
    }

    if (digit2 < digit3) {
        int b = digit2;
        digit2 = digit3;
        digit3 = b;
    }

    if (digit3 < digit4) {
        int c = digit3;
        digit3 = digit4;
        digit4 = c;
    }
    // 3rd Filtering

    if (digit1 < digit2) {
        int a = digit1;
        digit1 = digit2;
        digit2 = a;
    }

    if (digit2 < digit3) {
        int b = digit2;
        digit2 = digit3;
        digit3 = b;
    }

    // last filtering
    if (digit1 < digit2) {
        int a = digit1;
        digit1 = digit2;
        digit2 = a;
    }

    // Insert explanation for lines of code above here.

    System.out.print("The largest number with these digits is: " + digit1
            + digit2 + digit3 + digit4 + digit5); // Displays the digits in
                                                    // their sorted mann

我在 Java 中编写了一个算法,它在 冒泡排序 模型算法和 中解决了这个问题,而不用分隔数组或变量中的数字.

在我看来,这是最干净的解决方案,可能是最快的解决方案(如果有人能真正对这种算法进行基准测试,我将不胜感激)。

我最初创建这个算法是因为我很惊讶没有人试图解决这个问题 这个 方法而是将每个数字存储在单独的变量中,这会占用更多内存,在我看来是一种糟糕的编程和思维方式,因为它包含固定长度的参数整数等边界。

Fork it @ Github

public static int main(int n) {
    int l, r;
    final int size = (int)(Math.log10(n));
    for (int i = 0; i < size; i++) 
        for (int k = i; k < size; k++) {
            r = (int)(n/Math.pow(10,k)%10);
            l = (int)(n/Math.pow(10,k+1)%10);
            if(l < r)
                n += Math.pow(10,k)*(l-r) + Math.pow(10,k+1)*(r-l);
        }
    return n;
}