我正在接受Udemy课程,我遇到了挑战问题。作者似乎不愿意提出任何建议,所以我在这里问。
挑战在于使用for循环创建代码,该代码将计算任何给定范围内的奇数之和(范围由' start'和' end'参数定义)。第一种方法(isOdd)检查数字是否为奇数,第二种方法计算总和。
InteliJ现在给我警告或错误,但在测试时,代码没有显示正确的结果。我不知道bug在哪里。有人可以帮忙吗?
public class SumOddRange {
public static boolean isOdd(int number) {
if (number < 0) {
return false;
} else if (number % 2 > 0) {
return true;
} else {
return false;
}
}
public static int sumOdd (int start, int end) {
int sum = 0;
for (int i = start; i <= end; i++) {
if (isOdd(i) && end >= start && start > 0) {
sum += i;
return sum;
}
}
return -1;
}
}
答案 0 :(得分:2)
问题在于您返回您遇到的第一个奇数的总和。像这样修改它,只在最后返回总和来考虑整个范围:
min(event_id)
答案 1 :(得分:2)
这是我的正确解决方案。
public class SumOddRange {
public static boolean isOdd(int number) {
if (number <= 0) {
return false;
} else if (number % 2 > 0) {
return true;
} else {
return false;
}
}
public static int sumOdd (int start, int end) {
int sum = 0;
if ((start < 0 || end < 0) || end < start) {
return -1;
} else if ((end >= start) && (start > 0 && end > 0)) {
for (int i = start; i <= end; i++) {
if (isOdd(i) ) {
sum += i;
}
}
}
return sum;
}
}
答案 2 :(得分:1)
您可以看到我的解决方案。它可以在Udemy平台上运行
public class SumOddRange {
public static boolean isOdd(int number) {
if (number < 0) {
return false;
} else if (number % 2 > 0) {
return true;
} else {
return false;
}
}
public static int sumOdd(int start, int end) {
int sum = 0;
if ((start > end) || (start < 0)) {
return -1;
}
for (int i = start; i <= end; i++) {
if (isOdd(i)) {
sum += i;
}
}
return sum;
}
}
答案 3 :(得分:0)
您在找到第一个奇数后返回总和,从而计算错误。
答案 4 :(得分:0)
您不需要return
中的if-statement
。 return
存在函数,因此总是返回第一个奇数。
其次,您只需要检查isOdd
,因为这已经检查了数字是否大于零。 for循环确保start < end
这应该可以解决问题:
public class SumOddRange {
public static boolean isOdd(int number) {
if (number < 0) {
return false;
} else if (number % 2 > 0) {
return true;
} else {
return false;
}
}
public static int sumOdd (int start, int end) {
int sum = 0;
for (int i = start; i <= end; i++) {
if (isOdd(i)) {
sum += i;
}
}
return sum;
}
}
答案 5 :(得分:0)
@NiVeR已经提供了可行的解决方案。但是,为了包括问题和其他答案的评论,这里是改进的片段:
public class SumOddRange {
public static int sumOdd (int start, int end) {
// validation
if(start > end){
throw new IllegalArgumentException(start + " > " + end);
}
// empty sum is always 0
int sum = 0;
// if start is even, just increase by 1 to make it odd
if(start % 2 == 0){
start++;
}
for (int i = start; i <= end; i+=2) {
// i will always be odd
sum+=i;
}
return sum;
}
}
您可以看到,您并不总是需要检查数字是否为奇数。只需在开始时执行一次,然后按2
递增。
答案 6 :(得分:0)
您也可以在下面查看我的解决方案。我正严格按照要求去做。这是一个问题:
public class SumOddRange {
public static boolean isOdd(int number){
if((number > 0) && (number % 2 != 0)){
return true;
}else {
return false;
}
}
public static int sumOdd(int start, int end){
int sum = 0;
if(end >= start){
if((start > 0) && (end > 0)){
for (int i = start; i <= end; i++) {
if (isOdd(i)) {
sum = sum + i;
}
}
//need to return sum after all odd numbers are found within range
return sum;
}
}
return -1;
}
}