Java:从最大到最小的整数位排序

时间:2015-01-28 00:51:00

标签: java sorting if-statement

我需要帮助使用if语句将整数位从最大到最小排序,不使用字符串/数组或任何类型。 假设我已经初始化并导入了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

8 个答案:

答案 0 :(得分:0)

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

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

你可能想要:

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

无论如何,这是不可能的,因为算法不会排序&#39;排序&#39;五个变量。使用此代码,您只需将最大的数字存储在digit1

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

此外,您的最后一行代码:

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

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

答案 1 :(得分:0)

您需要定义5个项目,例如a1,a2,a3,a4,a5,并找到按顺序排列的最大或最小排序

答案 2 :(得分:0)

这是我刚写的内容的详细说明。基本上你必须获得5个整数(a1到a5)并返回其中的排序值。我先找到订单。例如,在以下测试数据中,7是第3项。然后将7和其他按照我从a1到a5提到的预定义int的适当顺序放入并打印出来......

公共等级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 五 4 1

答案 3 :(得分:0)

这绝对是功课,规则也不是那么清楚。但是,我确信该解决方案不包括对Math.min或Math.max方法的4次调用。用你的头脑查找一些排序算法并尝试实现一个。

答案 4 :(得分:0)

使用以下小型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;
}
...

答案 5 :(得分:0)

    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

答案 6 :(得分:0)

我用Java编写了一个算法,用冒泡排序模型算法解决了这个问题,在没有分离数组或变量数字的情况下解决了这个问题。

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

我最初创建这个算法是因为我很惊讶没有人试图解决这个问题这个的方式,而是将每个数字存储在单独的变量中,这些变量使用更多的内存,在我看来是一个糟糕的编程和思维风格因为它拥有诸如param整数的固定长度之类的边界。

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;
}

答案 7 :(得分:-1)

这是我想出的。基本思路是找到最小数字,然后使这个数字无效。不幸的是,这意味着原始数字数据会丢失,但您始终可以从用户输入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 + " ");
  }
}