1. 路飞的猜想
题意
有一天路飞突发奇想,他有一个猜想,任意一个大于 2 的偶数好像总能写成 2个质数的和。路飞查了资料,发现这个猜想很早就被一个叫哥德巴赫的人提出来了,称为哥德巴赫猜想。目前还没有证明这个猜想的正确性。路飞告诉你一个整数 n ,让你用这个数去验证。
注意 1 不是质数。
输入输出
代码
#include <iostream>
#include <algorithm>
#include <math.h>
#define F(i,a,b) for(int i = a; i < b; i++)
#define LL long long
#define pragma GCC optimize(2)
/*
1. 定义整型变量n,cnt=0,数组a
2. 输入n
3. 遍历2~n, 将其对应的下标元素值赋值为1
4. for i=2 to 根号n, do:
a. 如果a[i]不等于0
a-1.for j=i*i to n, do:
a-1-1.输出j
a-1-2. 将0赋值给a[j]
5. for i=2 to n/2
如果a[i]等于1且a[n-i]等于1
cnt加1
6.输出cnt
*/
const int N = 8000000;
int n, cnt = 0, a[N];
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin >> n;
F(i,2,N) {
a[i] = 1;
}
//外层控制倍数
for(int i = 2; i*i <= n; i++) {
if(a[i]) {
//内层将合数都清0
for(int j = i*i; j <= n; j += i) {
// cout << j << endl;
a[j] = 0;
}
}
}
for(int i = 2; i <= n / 2; i++) {
if(a[i]==1 && a[n-i]==1)
cnt++;
}
cout << cnt;
return 0;
}
2.两数之和
题意
给出一个有 n 个元素的数列 a 和一个整数 s ,其中数列 a 的元素是按照升序排列的。 请你在数列中找出两个元素 x,y ,使得 x+y=s
输入输出
代码
#include <iostream>
#include <algorithm>
#include <math.h>
#define F(i,a,b) for(int i = a; i < b; i++)
#define LL long long
#define pragma GCC optimize(2)
const int N = 100100;
int a[N];
int n,s;
using namespace std;
/*
1 2 3 4 5
i ^
j ^
4
x + y = s
1. 定义变量n,s,flag = 0
2. 输入n
3. 遍历数组a, 输入a[i]
4. 输入s
5. 双指针:for i=0 to n-1, do:
for j=1 to n-1, do:
a. 如果两数之和减去a[i]等于a[j]且a[i]不等于a[j]
a-1.将flag标记为1
a-2.输出"Yes"
a-3. 结束程序
b. 否则,跳过本次循环
6. 如果flag等于0,输出"No"
*/
int main()
{
ios::sync_with_stdio(false);
int flag = 0;
cin >> n;
F(i,0,n) cin >> a[i];
cin >> s;
F(i,0,n) {
F(j,1,n) {
if(s-a[i]==a[j] && a[i] != a[j]) {
flag = 1;
cout << "Yes";
return 0;
// cout << a[i] << " " << a[j]<<endl;
} else continue;
}
}
if(flag == 0)
cout << "No";
return 0;
}
3.是否可以求和
题意
给出一个有 n 个元素的数列 a 和两个整数 k 和 s ,其中数列 a 的元素是按照升序排列的。 请你在数列中找出一个元素 x ,使得的 x+k=s 。
输入输出
代码
#include <iostream>
#include <algorithm>
#include <math.h>
#define F(i,a,b) for(int i = a; i < b; i++)
#define LL long long
#define pragma GCC optimize(2)
/*
1.定义变量n,k,s,flag=0, 数组a
2.输入n
3.遍历数组a,输入a[i]
4.输入k和s
5.遍历数组a, do:
a. 如果两数之和减去k等于a[i]
a-1. 就将flag标记为1
a-2. 输出"Yes"
a-3. 退出程序
6. 如果flag等于0,就输出"No"
*/
const int N = 100100;
int n,k,s, a[N]; //n个数,x+k = s, x是否在n个数里
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int flag = 0;
cin >> n;
F(i,0,n) cin >> a[i];
cin >> k >> s;
F(i,0,n) {
if(s-k==a[i]) {
flag = 1;
cout << "Yes";
return 0;
}
}
if(flag == 0)
cout << "No";
return 0;
}
4.折半查找
题意
我们刚刚学习了折半查找,但是还没有自己来实践一下,这一节,你就需要自己实现一个折半查找的程序啦。 给定 N 个整数和 K 个待查找的整数 M1,M2,…,Mk 。如果待查找的整数在给定的 N 个整数中,请输出待查找的整数是数组中第几个元素(从 1 开始计算,第一个元素计 1 而不是0 );
如果待查找的整数不在给定的 N 个整数中,则输出 0 。
输入输出
代码
#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstring>
#define F(i,a,b) for(int i = a; i < b; i++)
#define LL long long
#define pragma GCC optimize(2)
/*
3 1
a 1 4 6
b 4
index 2
1.定义变量idx=0,n,k,数组a,数组b(存要查找的数)
2.输入n和k(查找多个数)
3.for i=1 to n, do:输入a[i]
4.for i=1 to k, do:输入b[i]
5.for i=1 to k, do: (外层循环,对k个数进行二分查找)
a. 将二分查找的结果赋值给idx
b. 输出idx
*/
const int N = 1001000;
int n,k,a[N],b[N];
int idx = 0;
using namespace std;
int binarySearch(int a[], int n, int x) {
int l = 1, r = n;
while(l <= r) {
int mid = (l+r) >> 1;
if(a[mid] == x)
return mid;
//左半部分找
else if(a[mid] > x)
r = mid - 1;
else
l = mid + 1;
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> k;
F(i,1,n+1) cin >> a[i];
F(i,1,k+1) cin >> b[i];
F(i,1,k+1) {
//对数组a进行折半查找
idx = binarySearch(a,n, b[i]);
cout << idx << " ";
}
return 0;
}