算术序列程序
Arithmetic Sequences program
我想编写一个程序序列,它读取任意数量的命令行整数并将它们存储在一个数组中。
然后程序在数组中查找 3 个数字,它们构成长度为 3 的算术序列。
例如:
% java Sequence 20 8 27 19 10 56 7 12 98
The numbers 8, 10, 12 located at indices 1, 4, 7 form an arithmetic sequence
到目前为止,这是我的代码,但它不起作用:
public class Sequence {
public static void main(String[] args){
int[] arr = new int[args.length];
for(int i = 0; i < arr.length; i++){
arr[i] = Integer.parseInt(args[i]);
}
// Process
for(int a = 0; a < arr.length; a++){
for(int b = 1; b < arr.length; b++){
for(int c = 2; c < arr.length; c++){
if (arr[b] - arr[a] == arr[c] - arr[b]){
System.out.println(a + " " + b + " " + c);
}
}
}
}
}
}
当我 运行 时,它向我显示:
1 4 7
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
您有两个主要问题:
- 您打印的不是找到的数字,而是它们的索引。您需要将
System.out.println(a + " " + b + " " + c);
更改为 System.out.println(arr[a] + " " + arr[b] + " " + arr[c]);
- 您的索引不正确。对于从第二个开始的每个索引,您最终会得到相同的数字三次,这总是会构建一个序列。
正确代码如下:
public class Sequence {
public static void main(String[] args){
// 20 8 27 19 10 56 7 12 98
int[] arr = new int[args.length];
for(int i = 0; i < arr.length; i++){
arr[i] = Integer.parseInt(args[i]);
}
for(int a = 0; a < arr.length; a++){
for(int b = a + 1; b < arr.length; b++){
for(int c = b + 1; c < arr.length; c++){
if (arr[b] - arr[a] == arr[c] - arr[b]){
System.out.println(arr[a] + " " + arr[b] + " " + arr[c]);
}
}
}
}
}
}
您想要的是在 a+1 处开始索引 b,在 b+1 处开始索引 c,以避免使用某些数字加倍。尽管我必须说,您打印的序列实际上是正确的,因为“5 5 5”是一个算术序列。添加这个小改动会导致:
public class Sequence {
public static void main(String[] args){
int[] arr = new int[args.length];
for(int i = 0; i < arr.length; i++){
arr[i] = Integer.parseInt(args[i]);
}
// Process
for(int a = 0; a < arr.length; a++){
for(int b = a+1; b < arr.length; b++){
for(int c = b+1; c < arr.length; c++){
if (arr[b] - arr[a] == arr[c] - arr[b]){
System.out.println(arr[a] + " " + arr[b] + " " + arr[c]);
//print the sequence and not the index
}
}
}
}
}
}
我想编写一个程序序列,它读取任意数量的命令行整数并将它们存储在一个数组中。 然后程序在数组中查找 3 个数字,它们构成长度为 3 的算术序列。
例如:
% java Sequence 20 8 27 19 10 56 7 12 98
The numbers 8, 10, 12 located at indices 1, 4, 7 form an arithmetic sequence
到目前为止,这是我的代码,但它不起作用:
public class Sequence {
public static void main(String[] args){
int[] arr = new int[args.length];
for(int i = 0; i < arr.length; i++){
arr[i] = Integer.parseInt(args[i]);
}
// Process
for(int a = 0; a < arr.length; a++){
for(int b = 1; b < arr.length; b++){
for(int c = 2; c < arr.length; c++){
if (arr[b] - arr[a] == arr[c] - arr[b]){
System.out.println(a + " " + b + " " + c);
}
}
}
}
}
}
当我 运行 时,它向我显示:
1 4 7
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
您有两个主要问题:
- 您打印的不是找到的数字,而是它们的索引。您需要将
System.out.println(a + " " + b + " " + c);
更改为System.out.println(arr[a] + " " + arr[b] + " " + arr[c]);
- 您的索引不正确。对于从第二个开始的每个索引,您最终会得到相同的数字三次,这总是会构建一个序列。
正确代码如下:
public class Sequence {
public static void main(String[] args){
// 20 8 27 19 10 56 7 12 98
int[] arr = new int[args.length];
for(int i = 0; i < arr.length; i++){
arr[i] = Integer.parseInt(args[i]);
}
for(int a = 0; a < arr.length; a++){
for(int b = a + 1; b < arr.length; b++){
for(int c = b + 1; c < arr.length; c++){
if (arr[b] - arr[a] == arr[c] - arr[b]){
System.out.println(arr[a] + " " + arr[b] + " " + arr[c]);
}
}
}
}
}
}
您想要的是在 a+1 处开始索引 b,在 b+1 处开始索引 c,以避免使用某些数字加倍。尽管我必须说,您打印的序列实际上是正确的,因为“5 5 5”是一个算术序列。添加这个小改动会导致:
public class Sequence {
public static void main(String[] args){
int[] arr = new int[args.length];
for(int i = 0; i < arr.length; i++){
arr[i] = Integer.parseInt(args[i]);
}
// Process
for(int a = 0; a < arr.length; a++){
for(int b = a+1; b < arr.length; b++){
for(int c = b+1; c < arr.length; c++){
if (arr[b] - arr[a] == arr[c] - arr[b]){
System.out.println(arr[a] + " " + arr[b] + " " + arr[c]);
//print the sequence and not the index
}
}
}
}
}
}