我读过关于循环不变量的内容,但我有点困惑 假设我有这个代码,不变量是什么?像A + B = X的东西?
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long A = scanner.nextLong();
long B = scanner.nextLong();
long resultado = 0;
for (long i = A; i <= B; i++) {
resultado += Long.bitCount(i);
}
System.out.println(Long.valueOf(resultado));
}
答案 0 :(得分:1)
不变量是一种在代码的某些部分始终为真的条件。循环不变是循环内的条件。不变量用于证明程序的正确性。更有用的不变量是正确性证明更强。我用强不变量来表示你的程序,它显示了 resultado 中将收到的程序:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long A = scanner.nextLong();
long B = scanner.nextLong();
long resultado = 0;
for (long i = A; i <= B; i++) {
resultado += Long.bitCount(i);
// loop invariants:
// strong: resultado = A + (A + 1) + ... + i => resultado = (A + i) * (i - A + 1) / 2,
// weak: resultado > A, A <= i <= B
}
System.out.println(Long.valueOf(resultado)); //invariants: resultado = (A + B) * (B - A + 1) / 2, this invariant prooves correctness of the program
}
之后,您可以将其与您的程序规范进行比较,如果运行良好,即使没有运行代码也可以做出决定。
我使用arithmetic progression的公式:。在循环结束时,我只是将 i 的最后一个值放在循环不变量中,并在程序结束时接收不变量。
希望我回答你的问题。
答案 1 :(得分:0)
阅读维基百科中的定义,我猜想以下内容:
A <= i <= B
resultado >= 0