二进制插入
思路:
m:1024:100000000 00
n:19 : 10011
要把n的二进制值插入m的第j位到第i位,只需要把n先左移j位,然后再进行或运算(|)即可。
m: 10000000000
n: 00001001100
10001001100
代码:
class BinInsert {
public:
int binInsert(int n, int m, int j, int i) {
// write code here
return n|(m<<j);
}
};
查找组成一个偶数最接近的两个素数
思路:
本题首先需要判断素数,素数表示除过1和本身,不能被其它数整除。
通过循环遍历来判断一个数是否为素数。为了提高效率,使用sqrt函数对被判断的数进行开平方,为什么进行开平方呢?
判断一个数是否为素数一般来讲是从2到它本身-1,看这个区间的数是否能整除这个数,但其实正常来讲,开平方之前的数如果能整除这个数,后面的数就不用判断了。
举例:
12
其实
1
2
{\sqrt12}
12之前的数如果能把12整除就不需要判断
1
2
{\sqrt12}
12之后的数了。
因为如果2能把12整除,那么
1
2
{\sqrt12}
12后面的6也能整除12
假如2不能把12整除,那么6也是不能整除12的。
11
1
1
{\sqrt11}
11约等于3.31,就判断2和3是否能把11整除就可以了。
而且最近的两个素数应该从最中间的位置开始向两边查找。
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
//判断素数
bool isPrime(int num) {
//从“double”转换到“int”,可能丢失数据
int tmp = sqrt(num);
//只遍历到开方出,不能被开方左边的数整除,则一定不能被开方右边的数整除
for (int i = 2; i <= tmp; i++) {
if (num % i == 0)
return false;
}
return true;
}
int main() {
int num;
int half;
int i;
while (cin >> num) {
half = num / 2;
//从中间向两边找
for (i = half; i > 0; i--) {
if (isPrime(i) && isPrime(num - i))
break;
}
cout << i << endl << num - i << endl;
}
return 0;
}
end