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
第一个错误是您没有恢复临时存储在 a
、b
、c
...而不是
中的变量
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 中编写了一个算法,它在 冒泡排序 模型算法和 中解决了这个问题,而不用分隔数组或变量中的数字.
在我看来,这是最干净的解决方案,可能是最快的解决方案(如果有人能真正对这种算法进行基准测试,我将不胜感激)。
我最初创建这个算法是因为我很惊讶没有人试图解决这个问题 这个 方法而是将每个数字存储在单独的变量中,这会占用更多内存,在我看来是一种糟糕的编程和思维方式,因为它包含固定长度的参数整数等边界。
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;
}
我需要帮助仅使用 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
第一个错误是您没有恢复临时存储在 a
、b
、c
...而不是
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 中编写了一个算法,它在 冒泡排序 模型算法和 中解决了这个问题,而不用分隔数组或变量中的数字.
在我看来,这是最干净的解决方案,可能是最快的解决方案(如果有人能真正对这种算法进行基准测试,我将不胜感激)。
我最初创建这个算法是因为我很惊讶没有人试图解决这个问题 这个 方法而是将每个数字存储在单独的变量中,这会占用更多内存,在我看来是一种糟糕的编程和思维方式,因为它包含固定长度的参数整数等边界。
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;
}