怎么提取生肖?
题主的意思大概是,如何得到一个数的阴阳属性吧 先放结论,我这个方法不一定是最快的,但一定最准确(只要你的数不是那种“40亿分之一的奇偶数”) 这里需要用到一个数学常识:两个整数的乘积一定是合数。 例如1和2的乘积是2,而3和4的乘积是12。 所以,如果我们要判断6是不是合数,只需要知道2和3是否都是合数即可。 而判定2是否是合数,只要知道1是否是合数即可。 因为2可以写成1*2的形式,必定是合数。 同理,要判断3是否是合数,只要知道1和2是否是合数即可。 这样我们就把原本需要判定6个数的判断题,变成了只需要判定2个数的判断题了!是不是很神奇~ 用到了两个数,那么肯定会有问题:如果一个数正好既是1又是另一个数的倍数,那么我们只能确定这个数是合数,而不能确定它的阴阳属性。
比如8,它是2的倍数也是3的倍数,1和2都符合条件,所以8肯定是合数没错,但是阳数还是阴数就不知道了。 但是,我们可以把1和2的个数作为一个整体,当成一个问题来考虑。 如果这个整体是5,也就是1+2+3+4+5=15,那么无论8到底是合数还是质数,它一定是阳数。因为15能被3整除,而3是奇数,所以15一定能被7整除,而7是阴数。
反之,假如这个整体是7,也就是1+2+3+4=10,那么无论8到底是合数还是质,它一定是阴数。这是因为10不能被3整除,所以8只能是质数;而且因为10是偶数,故8一定不是阴数。 我们需要找到1和2的最大公约数k,然后求出1和2的所有公倍数中,比k大的所有数的和s。那么,当且仅当s是3的倍数时,8才同时满足合数和阳数的条件。也就是说,只有当s>=15的时候,8才是合数并且是阳数。同样地,当s>=7的时候,8是合数并且是阴数。
综上,判断8的阴阳属性需要计算两次,第一次判断合性,第二次判断阴阳。其中第2次判断根据最大公约数的概念很容易求出,而第1次判断需要验证所有的可能性,比较麻烦。整个算法的时间量主要花在第1次判断上。