介意帮助遇到第一个减速带的新人吗?
Mind helping a newcomer who hit their first speed bump?
我刚开始学习如何在 Java 中编程。到目前为止一切顺利.. 直到我遇到这个 "bonus" question/problem 我们的老师给了我们额外的 "challenge".
Please click here to view the Question and the Sample input/output(图片文件)
请注意,我不允许使用 class 中未教授或未讨论的任何内容。因此,排除了数组、方法重载、将数组解析为方法、parseInt 等内容。
到目前为止,这是我能想到的:
import java.util.Scanner;
public class Test
{
public static void main(String[] args)
{
int N; // number of lines of input
double length1, length2, length3; // the 3 lengths
double perimeter; // you get this by adding the 3 lengths
double minperimeter=0; // dummy value
Scanner input = new Scanner(System.in);
System.out.println("Enter the number of triangles you have:");
N = input.nextInt();
System.out.println("Insert the lengths of the sides of these " +
"triangles (3 real numbers per line):");
for (int counter=0; counter<N; counter++)
{
length1 = input.nextDouble();
length2 = input.nextDouble();
length3 = input.nextDouble();
perimeter = (length1 + length2 + length3);
minperimeter = Math.min(perimeter,Math.min(perimeter,perimeter));
}
System.out.printf("The minimum perimeter is %.1f%n", minperimeter);
}
}
我的两个主要问题是:
1) 该程序仅存储和处理 'last' 输入。
它之前的那些被替换成了这个。[更新:解决了这个问题]
2) 我如何 在最终输出中打印 "triangle number"? [更新:也解决了这个问题]
所以,谁能帮我想出一个只需要 Java 的最基本知识的解决方案? 如果有帮助,this is the book我们正在使用。目前在第 4 章。但是我们确实学习了数学 Class(在第 5 章中)。
更新: 非常感谢大家的回复!我能够想出一个完全符合我的问题的解决方案。
Math.min(perimeter,perimeter)
永远给你perimeter
。你可能想做 Math.min(perimeter,minPerimeter)
因为这是一个编程作业,如果我不给你第二个问题的完整解决方案是最好的,但你的提示是在 for 循环的 counter
参数中。在更新 minperimeter
时保存它,这样您就知道在循环的哪次迭代中找到了最小值。
此外,将您的 minPerimeter 初始化为 10000 或更高。如果从 0 开始,Math.Min 将永远不会低于该数值。
将您的 for 循环更改为:
double minperimeter=-1;
for (int counter=0; counter<N; counter++)
{
length1 = input.nextDouble();
length2 = input.nextDouble();
length3 = input.nextDouble();
perimeter = (length1 + length2 + length3);
if(minperimeter == -1){
minperimeter = perimeter;
} else{
Math.min(perimeter,minperimeter);
}
}
您必须将较小的周长存储在变量 perimeter
中。
您的任务提示告诉您,任何给定的周长都小于 1000。因此将周长初始化为 1000。
在您的 for 循环中,您必须存储较小的周长:
perimeter = Math.min(perimeter, length1 + length2 + length3)
如果边的总和小于当前周长,则存储较小的值。
请注意,根据您给定的任务,您必须在一行内输入 3 个双打。
备选方案
制作一个 ArrayList 并将所有周长添加到该列表,然后从该列表中找到最小值。
List<Double> perimeter = new ArrayList<>();
for (int counter=0; counter<N; counter++)
{
length1 = input.nextDouble();
length2 = input.nextDouble();
length3 = input.nextDouble();
perimeter.add(length1 + length2 + length3);
}
System.out.printf("The minimum perimeter is %.1f%n", Collections.min(perimeter));
我刚开始学习如何在 Java 中编程。到目前为止一切顺利.. 直到我遇到这个 "bonus" question/problem 我们的老师给了我们额外的 "challenge".
Please click here to view the Question and the Sample input/output(图片文件)
请注意,我不允许使用 class 中未教授或未讨论的任何内容。因此,排除了数组、方法重载、将数组解析为方法、parseInt 等内容。
到目前为止,这是我能想到的:
import java.util.Scanner;
public class Test
{
public static void main(String[] args)
{
int N; // number of lines of input
double length1, length2, length3; // the 3 lengths
double perimeter; // you get this by adding the 3 lengths
double minperimeter=0; // dummy value
Scanner input = new Scanner(System.in);
System.out.println("Enter the number of triangles you have:");
N = input.nextInt();
System.out.println("Insert the lengths of the sides of these " +
"triangles (3 real numbers per line):");
for (int counter=0; counter<N; counter++)
{
length1 = input.nextDouble();
length2 = input.nextDouble();
length3 = input.nextDouble();
perimeter = (length1 + length2 + length3);
minperimeter = Math.min(perimeter,Math.min(perimeter,perimeter));
}
System.out.printf("The minimum perimeter is %.1f%n", minperimeter);
}
}
我的两个主要问题是:
1) 该程序仅存储和处理 'last' 输入。
它之前的那些被替换成了这个。[更新:解决了这个问题]
2) 我如何 在最终输出中打印 "triangle number"? [更新:也解决了这个问题]
所以,谁能帮我想出一个只需要 Java 的最基本知识的解决方案? 如果有帮助,this is the book我们正在使用。目前在第 4 章。但是我们确实学习了数学 Class(在第 5 章中)。
更新: 非常感谢大家的回复!我能够想出一个完全符合我的问题的解决方案。
Math.min(perimeter,perimeter)
永远给你perimeter
。你可能想做 Math.min(perimeter,minPerimeter)
因为这是一个编程作业,如果我不给你第二个问题的完整解决方案是最好的,但你的提示是在 for 循环的 counter
参数中。在更新 minperimeter
时保存它,这样您就知道在循环的哪次迭代中找到了最小值。
此外,将您的 minPerimeter 初始化为 10000 或更高。如果从 0 开始,Math.Min 将永远不会低于该数值。
将您的 for 循环更改为:
double minperimeter=-1;
for (int counter=0; counter<N; counter++)
{
length1 = input.nextDouble();
length2 = input.nextDouble();
length3 = input.nextDouble();
perimeter = (length1 + length2 + length3);
if(minperimeter == -1){
minperimeter = perimeter;
} else{
Math.min(perimeter,minperimeter);
}
}
您必须将较小的周长存储在变量 perimeter
中。
您的任务提示告诉您,任何给定的周长都小于 1000。因此将周长初始化为 1000。
在您的 for 循环中,您必须存储较小的周长:
perimeter = Math.min(perimeter, length1 + length2 + length3)
如果边的总和小于当前周长,则存储较小的值。
请注意,根据您给定的任务,您必须在一行内输入 3 个双打。
备选方案
制作一个 ArrayList 并将所有周长添加到该列表,然后从该列表中找到最小值。
List<Double> perimeter = new ArrayList<>();
for (int counter=0; counter<N; counter++)
{
length1 = input.nextDouble();
length2 = input.nextDouble();
length3 = input.nextDouble();
perimeter.add(length1 + length2 + length3);
}
System.out.printf("The minimum perimeter is %.1f%n", Collections.min(perimeter));