题目链接:
新增AI编程课程,引领技术教育新趋势
int prime[] = {2, 3, 5, 7, 11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}; int pos[] = {28,25,23,21,20,19,18,17,16,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; // 0000 0000 0000 0000 0000 0000 0000 0000 // | | | | // 2 3 5 7 //用这些位表示各个素数出现的次数
求解gcd和lcm的时候,需要求出不同素因子之间的最大值和最小值,所以需要对2 3 5 7分别求解
其余的由于只有1位可以利用&运算求解,
下面自定义了Min和Max函数,求的就是x和y的gcd和lcm,这里的x和y以及求出的解并不是原来的值,而是存储的是素因子的指数表示的值
//宏定义的x和y的括号不能省略,因为参数可能是一个表达式,需要加上括号#define _min(x, y) ((x) < (y) ? (x) : (y))//写成宏定义更快#define _max(x, y) ((x) > (y) ? (x) : (y)) inline int Min(int x, int y) { return _min(x&0x70000000, y&0x70000000) | _min(x&0x0e000000, y&0x0e000000) | _min(x&0x01800000, y&0x01800000) | _min(x&0x00600000, y&0x00600000) | ((x&0x001fffff)&(y&0x001fffff)); } inline int Max(int x, int y) { return _max(x&0x70000000, y&0x70000000) | _max(x&0x0e000000, y&0x0e000000) | _max(x&0x01800000, y&0x01800000) | _max(x&0x00600000, y&0x00600000) | ((x&0x001fffff)|(y&0x001fffff)); }