12月27日

89 阅读1分钟

1. 路飞的猜想

题意

​ 有一天路飞突发奇想,他有一个猜想,任意一个大于 2 的偶数好像总能写成 2个质数的和。路飞查了资料,发现这个猜想很早就被一个叫哥德巴赫的人提出来了,称为哥德巴赫猜想。目前还没有证明这个猜想的正确性。路飞告诉你一个整数 n ,让你用这个数去验证。

​ 注意 1 不是质数

输入输出

image.png

代码

#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

输入输出

image.png

代码

#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 。

输入输出

image.png

代码

#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 。

输入输出

image.png image.png

代码

#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;
}

填涂颜色

题意

输入输出

代码