添加用户输入提供的 L1 和 L2 范围内的奇数和偶数
Addition of odd and even numbers from range of L1 and L2 provided by user input
我正在努力完成这项任务。
用户提供号码 L1 和 L2。将 L1、L2 范围内的所有奇数和该范围内的所有偶数相加并显示总和。我必须以 3 种方式实现它,使用:for、while 和 do while 循环。
我的 for 循环运行完美,但 while 显示了一些更高的分数。
import java.util.Scanner;
public class PPO4b {
public static void main(String[] args) {
Scanner value1Check = new Scanner(System.in);
System.out.println("Provide first value: ");
int value1 = value1Check.nextInt();
Scanner value2Check = new Scanner(System.in);
System.out.println("Provide second value: ");
int value2 = value2Check.nextInt();
int sumOdd = 0;
int sumEven = 0;
int i = 0;
while (i <= 0) {
if (i % 2 == 1) {
sumOdd = sumOdd + i;
} else {
sumEven = sumEven + i;
}
i = i + 1;
}
System.out.println("Sum is equal to: " + sumEven);
System.out.println("Sum is equal to: " + sumOdd);
}
}
根据您当前的方法,这里有一些观察结果。
您只需要一台扫描仪。
您正在测试 i
奇偶校验,而您应该测试输入范围
例如应该是这样的:
while (value1 <= value2) {
if (value1 % 2 == 1) {
sumOdd = sumOdd + value1;
别忘了增加value1
打印时,不要只用 sum
标记每个总和。使用描述性名称
替代方法
只要稍加计算,您就可以在 O(1)
时间内完成。
- 对于
1 thru n
值的总和,n(n+1)/2)
将给出总和
- 与
k thru n
值类似,(n-k+1)(n+k)/2
将给出这些值的总和。
- 现在考虑像
2 3 4 5 6
这样的数字范围。偶数的总数为 3
,即 2, 4, and 6
。即使您有 1 2 3 4 5 6 7
. 也是如此
- 对于任何偶数
s
,下一个较低的是 ((s-1)
。所以如果 s = 4
会是 3
- 对于任何奇数
s
,下一个较低的值将是 (s-1)|1
。所以对于 s == 4
、(s-1) = 3 and 3|1 == 3
。 OR
简单地设置低位使值变为奇数或让它保持奇数。
- 类似地,对于任何值
e
,e|1
将是相同的奇数值或下一个最高值。
现在有足够的信息来计算 even
和 odd
之间的值之和 s and e
。
对于给定的 int e 和 int s;
int totalSum = ((e+s)*(e-s+1))/2;
e = (e|1);
s = (s-1)|1;
int evenCount = (e-s)/2;
int sumEven = ((e - s + 1) * (evenCount))/2;
int sumOdd = totalSum - sumEven;
验证方法如下。
- 使用范围的
IntStream
计算偶数和奇数之和,适当过滤掉偶数和奇数值
- 接下来使用上述方法计算相同的值。
- 比较相应的金额并报告任何差异。
Random rnd = new Random();
for (int i = 0; i < 200000; i++) {
int s = rnd.nextInt(200) +100;
int e = rnd.nextInt(500) + s;
int compEven = IntStream.rangeClosed(s, e)
.filter(r -> r % 2 == 0).sum();
int compOdd = IntStream.rangeClosed(s, e)
.filter(r -> r % 2 == 1).sum();
int totalSum = (e + s) * (e - s + 1) / 2;
e |= 1;
s = (s - 1) | 1;
int evenCount = (e - s + 1) / 2;
int evenSum = ((e + s) * evenCount) / 2;
int oddSum = totalSum - evenSum;
if (evenSum != compEven || oddSum != compOdd) {
System.out.println("Oops - sums don't match");
}
}
注意:根据范围,您可能需要使用 long 或 BigInteger 类型以避免溢出。
我正在努力完成这项任务。 用户提供号码 L1 和 L2。将 L1、L2 范围内的所有奇数和该范围内的所有偶数相加并显示总和。我必须以 3 种方式实现它,使用:for、while 和 do while 循环。 我的 for 循环运行完美,但 while 显示了一些更高的分数。
import java.util.Scanner;
public class PPO4b {
public static void main(String[] args) {
Scanner value1Check = new Scanner(System.in);
System.out.println("Provide first value: ");
int value1 = value1Check.nextInt();
Scanner value2Check = new Scanner(System.in);
System.out.println("Provide second value: ");
int value2 = value2Check.nextInt();
int sumOdd = 0;
int sumEven = 0;
int i = 0;
while (i <= 0) {
if (i % 2 == 1) {
sumOdd = sumOdd + i;
} else {
sumEven = sumEven + i;
}
i = i + 1;
}
System.out.println("Sum is equal to: " + sumEven);
System.out.println("Sum is equal to: " + sumOdd);
}
}
根据您当前的方法,这里有一些观察结果。
您只需要一台扫描仪。
您正在测试
i
奇偶校验,而您应该测试输入范围
例如应该是这样的:while (value1 <= value2) { if (value1 % 2 == 1) { sumOdd = sumOdd + value1;
别忘了增加
value1
打印时,不要只用
sum
标记每个总和。使用描述性名称
替代方法
只要稍加计算,您就可以在 O(1)
时间内完成。
- 对于
1 thru n
值的总和,n(n+1)/2)
将给出总和 - 与
k thru n
值类似,(n-k+1)(n+k)/2
将给出这些值的总和。 - 现在考虑像
2 3 4 5 6
这样的数字范围。偶数的总数为3
,即2, 4, and 6
。即使您有1 2 3 4 5 6 7
. 也是如此
- 对于任何偶数
s
,下一个较低的是((s-1)
。所以如果s = 4
会是3
- 对于任何奇数
s
,下一个较低的值将是(s-1)|1
。所以对于s == 4
、(s-1) = 3 and 3|1 == 3
。OR
简单地设置低位使值变为奇数或让它保持奇数。 - 类似地,对于任何值
e
,e|1
将是相同的奇数值或下一个最高值。
现在有足够的信息来计算 even
和 odd
之间的值之和 s and e
。
对于给定的 int e 和 int s;
int totalSum = ((e+s)*(e-s+1))/2;
e = (e|1);
s = (s-1)|1;
int evenCount = (e-s)/2;
int sumEven = ((e - s + 1) * (evenCount))/2;
int sumOdd = totalSum - sumEven;
验证方法如下。
- 使用范围的
IntStream
计算偶数和奇数之和,适当过滤掉偶数和奇数值 - 接下来使用上述方法计算相同的值。
- 比较相应的金额并报告任何差异。
Random rnd = new Random();
for (int i = 0; i < 200000; i++) {
int s = rnd.nextInt(200) +100;
int e = rnd.nextInt(500) + s;
int compEven = IntStream.rangeClosed(s, e)
.filter(r -> r % 2 == 0).sum();
int compOdd = IntStream.rangeClosed(s, e)
.filter(r -> r % 2 == 1).sum();
int totalSum = (e + s) * (e - s + 1) / 2;
e |= 1;
s = (s - 1) | 1;
int evenCount = (e - s + 1) / 2;
int evenSum = ((e + s) * evenCount) / 2;
int oddSum = totalSum - evenSum;
if (evenSum != compEven || oddSum != compOdd) {
System.out.println("Oops - sums don't match");
}
}
注意:根据范围,您可能需要使用 long 或 BigInteger 类型以避免溢出。