//Precondition: n > 0
//Postcondition: returns the minimum number of decial digits
// necessary to write out the number n
int countDigits(int n){
1. int d = 0;
2. int val = n;
3. while(val != 0){
4. val = val / 10; // In C++: 5 / 2 === 2
5. d++;
6. }
7. return d;
}
不变量:在第3行评估环路保护之前,删除最右边d位的n与val相同。 (假设数字0需要0位才能写出,并且是唯一需要写0位数的数字)。
证明使用循环不变量的归纳法。
现在我一直认为带有归纳的证明假设通过用k替换等式中的变量将是真的,那么我必须证明k + 1也将是真的。但我并没有在这个问题中给出一个等式而只是一个代码块。这是我的基本案例:
在评估第3行的环路保护之前,d等于0,在第2行,val == n,所以如果n的最右边的0位被删除,则为val。因此,基本情况成立。
由于我不确定如何证明k + 1,我不确定如何写入归纳步骤。
答案 0 :(得分:0)
除了通过循环的k
迭代替换等式中的n
值之外,逻辑与方程实际上是相同的:
N
之前不变量保持不变,那么在执行迭代N
之后它仍将保持。从1.和2.我们通过归纳得出结论,不变量在循环结束时(或者在任何迭代结束时,实际上)保持不变。
编辑,这很有趣,因为循环以val == 0
结尾。你的不变量(在循环结束时仍为真)是 n,其最右边的d个数字被移除与val 相同,因此移除了n
个数字的d
与0相同此时,d
正确显示n
所需的位数。