好久不见……
这次来说说求平均数的问题。
问题很简单,就是求 (a+b)/2。
当然,我不是让你直接printf(“%d”,(a+b)/2); 这样随便一个人学一小时C语言就可以做到。
问题是 a+b 如果溢出了怎么办?溢出的话就得不到正确结果了,这样该怎么解决?
如果简单的避免溢出,将程序改成 a/2+b/2,这样也是不对的,这样会在a,b都为奇数时导致缺失。
还有人会给出 a+(b-a)/2,其实这种办法也是治标不治本,因为加和减是一样的,既然加法会溢出,那么同样,减法也会溢出,所以这种办法也是没有意义的。
说说我的想法吧,首先举个例子: (193+235)/2,对这两个数,我们已知计算时会发生上溢出,所以可以尝试 a+(b-a)/2这个公式,但是这个公式仅适用于减法不会下溢出的情况下。虽然这个公式并不是正确的,但是我们可以从公式中得到一些东西:
(193+235)/2 => (193+193+42)/2 => 193+(42)/2
其中,42就是235-193
我们可以把193+(42)/2看作是193+(42+0)/2,也可以看作是192+(43+