有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将范围为JAVA的所有奇数相加

我有一个问题,我有正确的(第1部分)和错误的代码(第2部分)。我搞不懂为什么不正确的代码是不正确的

那个

static int sum = 0

部分是第2部分代码中不正确的部分。如果那行代码移到第1部分的同一位置。代码是有效的

如果范围在10到20之间。第2部分输出的111之和不正确。总数应该是75。有三种可能的组合可以得到111

18 + 18 + correct sum
17 +19 + correct sum
16 + 20 + correct sum

我猜第二部分经过18+18?但是怎么做

第1部分正确代码

ublic class SumOddRange {

public static boolean isOdd(int number){
    if (number <= 0) {
        return false;
    }
    
    return number % 2 != 0;
    
}

public static int sumOdd(int start, int end){
    if ( (end < start) || (start < 0) || (end < 0) ){
        return -1;
    }
    int sum = 0;
    
    for (int i = start; i<=end; i++){
        if (isOdd(i)){
            sum +=i;
        }
    }
    return sum;
    
}

第2部分错误代码

public class SumOddRange {



public static boolean isOdd(int number) {
    if((number > 0) && (number % 2 != 0)) {

        return true;
    }
    else {

        return false;
    }
}

static  int startOne = 0;
static int sum = 0;
public static int sumOdd(int start, int end) {
    if ((end >= start) && (end > 0) && (start > 0)) {

        for (startOne = start; startOne <= end; startOne++) {
            if (isOdd(startOne)) {
                sum += startOne;


            }
        }

        return sum;
    } else

        return -1;
}

共 (1) 个答案

  1. # 1 楼答案

    问题是您正在使用static变量

    什么是static

    enter image description here

    创建类后,可以创建该类的实例(也称为对象)。这就是当你使用像

    SumOddRange a = new SumOddRange();

    SumOddRange b = new SumOddRange();

    您可能知道,类中有方法和变量。这些方法和类可以分为

    • 类方法和变量
    • 对象方法和变量(对象变量通常被称为属性

    这意味着某些方法和变量确实属于该类,因此该类的所有实例都共享该变量或方法。这就是static的用途。因此,如果上图中的类有一个名为staticAttributeName的静态属性,a.staticAttributeNameb.staticAttributeName必须相同

    如果变量不是静态的,则实例不会共享该变量。所有实例都有自己的实例。因此,尽管它们的名称相同,但保存在变量中的值不必相同。因此,如果上图中的类有一个名为attributeName的非静态属性,a.attributeNameb.attributeName不一定是相同的

    一个例子:

    public class Add {
        public static int sum = 0;
    
        public static void addOne() {
            sum = sum + 1;
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Add a = new Add();
            Add b = new Add();
    
            a.addOne();
            b.addOne();
            System.out.println("a " + a.sum);
            System.out.println("b " + b.sum);   
        }
    }
    

    如您所见,变量sum是静态的。这意味着a.sumb.sum是相同的。在main方法中,我们两次调用方法addOne,因此两个输出是“a2”和“b2”

    public class Add {
        public int sum = 0;
    
        public void addOne() {
            sum = sum + 1;
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Add a = new Add();
            Add b = new Add();
    
            a.addOne();
            b.addOne();
            b.addOne();
            System.out.println("a " + a.sum);
            System.out.println("b " + b.sum);   
        }
    }
    

    我们现在在类Add中有一个非静态变量sum

    • 答:我们正在调用方法addOne一次,所以第一个输出是“a1”
    • b:方法addOne被调用了两次,因此输出为“b2”

    解决问题

    public class Test {
        public static void main(String[] args) {
            SumOddRange s = new SumOddRange();    //Using class given in PART2 of question
            SumOddRange t = new SumOddRange();
            System.out.println(s.sumOdd(10,20));
            System.out.println(s.sumOdd(10,20));
        }
    }
    

    这个类产生输出75150。这种情况是这样的,因为st使用了相同的变量sum,所以第一次,求和是正确的,但第二次计算的结果是75+sumOdd(10,20) = 75+75 = 150

    我们现在知道,主要的问题是变量是static。这就引出了只使用非静态变量的想法,这是这里最好的想法:

    public class SumOddRange {
    
        public boolean isOdd(int number) {
            if((number > 0) && (number % 2 != 0)) {
                return true;
            }
            else {
                return false;
            }
        }
    
        int startOne = 0;
        int sum = 0;
        public int sumOdd(int start, int end) {
            sum = 0;
            if ((end >= start) && (end > 0) && (start > 0)) {
                for (startOne = start; startOne <= end; startOne++) {
                    if (isOdd(startOne)) {
                        sum += startOne;
                    }
                }
                return sum;
            } else {
                return -1;
            }        
        }
    }
    

    另一种选择是在实际计算总和之前重置变量sum。这种方法的缺点是,您将无法再访问早期结果:

    static  int startOne = 0;
    static int sum = 0;
    public static int sumOdd(int start, int end) {
        sum = 0;
        if ((end >= start) && (end > 0) && (start > 0)) {
            for (startOne = start; startOne <= end; startOne++) {
                if (isOdd(startOne)) {
                    sum += startOne;
                }
            }
            return sum;
        } else {
            return -1;
        }        
    }