这篇文章的主要目的就是为了自己收集、总结一些编程时的小技巧。示例语言是C++。
/* 判断质数,判断素数
*
* 0、1、负数、偶数,都直接false。
* 剩下只需要判断是否存在奇数因数。最小的非prime奇数是9,所以可以从i=3开始。
* i*i<p 这个条件是为了减少for循环的次数,即根号优化。
* */
bool isPrime(int p) {
if (p<2 || !(p%2)) return false;
for (int i=3; i*i<=p; i+=2) {
if (!(p%i)) return false;
}
return true;
}
/* 两个变量交换值,不引入临时变量
*
* 注意,应用在较大的动态数组上有时候会出错,不知道原因。发现会出错的话就用临时变量吧。
* */
void swapWithoutTemp(int& a, int& b) {
a += b;
b = a-b;
a -= b;
}
/* 快速判断一个整数是否为2的正整数次幂
*
* 计算机用二进制存储所有内容。
* 如果n是2的正整数次幂,假设n用x位来表示。
* 那么n的表示一定是1后面跟(x-1)个0,那么(n-1)的表示一定是0后面跟(x-1)个1。
* 因此对n和(n-1)进行逻辑与运算,一定会得到0。
* */
bool isPowerOf2(int n) {
return !(n & (n-1));
}
/* 判断质数,判断素数
*
* 0、1、负数、偶数,都直接false。
* 剩下只需要判断是否存在奇数因数。最小的非prime奇数是9,所以可以从i=3开始。
* i*i<p 这个条件是为了减少for循环的次数,即根号优化。
* */
bool isPrime(int p) {
if (p<2 || !(p%2)) return false;
for (int i=3; i*i<=p; i+=2) {
if (!(p%i)) return false;
}
return true;
}
/* 两个变量交换值,不引入临时变量
*
* 注意,应用在较大的动态数组上有时候会出错,不知道原因。发现会出错的话就用临时变量吧。
* */
void swapWithoutTemp(int& a, int& b) {
a += b;
b = a-b;
a -= b;
}
/* 快速判断一个整数是否为2的正整数次幂
*
* 计算机用二进制存储所有内容。
* 如果n是2的正整数次幂,假设n用x位来表示。
* 那么n的表示一定是1后面跟(x-1)个0,那么(n-1)的表示一定是0后面跟(x-1)个1。
* 因此对n和(n-1)进行逻辑与运算,一定会得到0。
* */
bool isPowerOf2(int n) {
return !(n & (n-1));
}
Comments
Post a Comment