求前20项和为23.597738。可我的结果是23.597742。我是哪里写错了吗
float全部改为double
float有效数字一共只有7位,你这答案都有8位,不算中间过程的误差,结果本身就已经不可信了
换句话说,你把23.597738直接赋值给y,再打印y,就已经不是这个数了
考虑一个边界问题,为什么不能让i = l
和j = r
然后使用while循环代替do-while循环?
探讨一下写成如下形式会有什么问题
while(q[i] < x) i++;
while(q[j] > x) j--;
若数组中存在重复的数字,某一轮可能存在**i
和j
都指向重复的数字**,并且分界点x
也是这个数字,上述两个while语句的判断就会结束循环,此时q[i] = q[j] = x
,交换i
和j
指向这个局面仍然不会改变,因此下一轮会重复这个过程,陷入死循环。
因此,要确保每轮下来两个指针都至少会移动一步,保证上一次交换的结果不会再次判断。
思路是,在判断while条件时,先移动指针。用do-while
最容易实现这个思想,也可以用while
实现:
do i++; while(q[i] < x);
do j--; while(q[j] > x);
//等价于
while(q[++i] < x);
while(q[--j] > x);
同时为了保证每轮下来边界l
和r
都能被判断到,因此初始化要i = l - 1, j = r + 1
使指针在数组两端之外。