这个问题适合数学家。它已经在办公室里流传开来,我们想看看谁能想出一个更优化的版本。
(((a+p) <= b) && (a == 0 || a > 1) && (b >= p)) &&
((b - (a + p) == 0) || (b - (a + p) > 1))
编辑: 所有数据都是正整数
编辑: 更好等于更简单
这个问题适合数学家。它已经在办公室里流传开来,我们想看看谁能想出一个更优化的版本。
(((a+p) <= b) && (a == 0 || a > 1) && (b >= p)) &&
((b - (a + p) == 0) || (b - (a + p) > 1))
编辑: 所有数据都是正整数
编辑: 更好等于更简单
(a + p <= b) && (a != 1) && (b - a - p != 1);
通过引入更多表示每个表达式含义的本地变量来简化重构。如果没有对a、b和p的含义有所了解,这对我们来说是很困难的。
b >= p && b != p+1
编辑: 好的,之前那个方法不行,但是这个可以:
a != 1 && b >= a+p && b-a-p != 1
(a!=1) && ((b==a+p) || (b>1+a+p))
这可能不是最简单的,但应该是最易读的之一。
在那个表达式中,我不会计算所有的数学运算。例如,b - ( a + p ) 被计算了两次。如果可能的话,应该将它们拆分为变量。
此外,编写波兰式表示法树可能有助于优化它,可以重复使用所有看到两次的内容。
由于它们都是正整数,因此可以删除很多重复的内容:
因此,作为第一步,
(((a+p) <= b) && (a == 0 || a > 1) && (b >= p)) && ((b - (a + p) == 0) || (b - (a + p) > 1))
变成
((a+p) <= b) && (a != 1) && (b >= p)) && ((b - (a + p) != 1)
为了更加清晰易懂,这只是将(foo == 0 || foo > 1)
的模式替换为foo != 1
该模式在上述内容中出现两次,一次是当foo=a时,另一次是当foo = (b - (a+p))
时。
s = a + p
b >= s && a != 1 && b - s - 1 > 0
Checked,返回与问题相同的布尔值。
我用来检查的程序:(编写它很有趣)
#include <iostream>
using namespace std;
typedef unsigned int uint;
bool condition(uint a, uint b, uint p)
{
uint s = a + p;
return uint( b >= s && a != 1 && b - s - 1 > 0 )
== uint( (((a+p) <= b) && (a == 0 || a > 1) && (b >= p))
&& ((b - (a + p) == 0) || (b - (a + p) > 1)) );
}
void main()
{
uint i = 0;
uint j = 0;
uint k = 0;
const uint max = 50;
for (uint i = 0; i <= max; ++i)
for (uint j = 0; j <= max; ++j)
for (uint k = 0; k <= max; ++k)
if (condition(i, j, k) == false)
{
cout << "Fails on a = " << i << ", b = " << j;
cout << ", p = " << k << endl;
int wait = 0;
cin >> wait;
}
}
由于整数是无符号的,因此可以用(a==0 || a>1)代替(a !=1)。
通过第一次处理,您可以将其简化为:
uint sum = a + p;
return ((sum <= b) && (a != 1) && (b >= p)) && (b - sum != 1);
bap = b - (a + p)
bap >= 0 && bap != 1 && a != 1
编辑:现在我因为诚实地试图帮忙以及提供了一个我认为是有效的答案而被扣去了-2分。对于那些能使用Python的人,这里有两个函数,一个包含问题,另一个包含我的答案:
def question(a, b, p):
return (((a+p) <= b) and (a == 0 or a > 1) and (b >= p)) or ((b - (a + p) == 0) or (b - (a + p) > 1))
def answer(a, b, p):
bap = b - (a + p)
return bap >= 0 and bap != 1 and a != 1