零碎的知识点

141 阅读2分钟

数学

曼哈顿距离

棋盘格上判断某个点到基准点的横纵距离之和
一般竖着是x轴 横着是y轴 因为多维数组是一行行的 A2B3C34BA1D69341BB2790706188AF13.jpg

//输入一个n 打印n阶菱形 n是奇数
#include<iostream>

using namespace std;

int main()
{
	int n;
	cin >> n;
	int cx = n / 2, cy = n / 2;//确定中点值的坐标
	for (int i = 0; i < n; i++)//x轴
	{
		for (int j = 0; j < n; j++)//y轴
		{
			if (abs(i - cx) + abs(j - cx) <= n / 2)//曼哈顿距离小于n/2打印星号
				cout << '*';
			else cout << ' ';
		}
		cout << endl;
	}
	return 0;
}

语法

为防止数组越界 数组可以多开十个
为防止数组太大爆栈 可以把数组开到函数外面(堆)
ios::sync_with_stdio(false);用来优化cin cout速度

类 引用 链表

懒得打了 看讲义7吧
引用

函数

swap

交换两个数的位置
<algorithm>
void swap(a,b)

stl 常用库函数

懒得打了 见讲义8、9

sort

快排

sqrt

开方
<math.h> <cmath> double sqr(double x)

abs fabs

绝对值
<stdlib.h> <cmath> int abs(int x)
<math.h> <cmath> double fabs(double x)
用途:有时候计算会有误差 可以用fabs限制误差范围 1e-6

rand

随机数
#include <stdlib.h>
#include <time.h>
srand((unsigned)time(NULL));
rand() % 范围最大值 + 1;
rand

reverse

把数组从第a个数到第b-1个数的顺序全部倒过来
reverse(a,b) #include <algorithm>

//输入一个n 再输入n个整数 将这个数组顺时针旋转k(k≤n)次 最后将结果输出 旋转一次是指 将最左边的数放到最右边  

//普通做法 时间复杂度高  
#include<iostream>

using namespace std;

int main()
{
	int n, k, a[100];
	cin >> n, k;
	for (int i = 0; i < n; i++)
		cin >> a[i];//依次读入
	while (k--)
	{
		int t = a[n - 1];//最右边的先拿出来
		for (int i = n - 2; i >= 0; i--)//全部右移
			a[i + 1] = a[i];
		a[0] = t;//第一个元素是最右边的
	}
	for (int i = 0; i < n; i++)
		cout << a[i] << ' ';
	return 0;
}

//巧妙做法 用reverse函数 把数组整个翻转 然后分成两部分 然后分别把两部分翻转 
//12345 54321 45321 45123
#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
	int n, k, a[100];
	cin >> n >> k;
	for (int i = 0; i < n; i++)
		cin >> a[i];//依次读入
	reverse(a, a + n);//翻转全部
	reverse(a, a + k);//翻转前k个数字
	reverse(a + k, a + n);//翻转后面的数字
	for (int i = 0; i < n; i++)
		cout << a[i] << ' ';
	return 0;
}

memset

把数组初始化为某个值 <cstring>
memset(a,b,c)//a为数组名字 b为初始化的值 c为初始化的长度(单位是字节)

memcpy

复制数组 cstring
memcpy(a,b,c)//a为目标数组名字 b为复制数组名字 c为复制长度(单位是字节)

字符串函数

image.png

读入字符串

scanf或者cin读入遇到空格回车会停止 输出时遇到'\0'才会停止

char str[100];
scanf("%s", &str);
cin >> str;

想读入一行的话
如果是读入字符数组 fgets <cstdio>

char str[20]; /*定义一个最大长度为19, 末尾是'\0'的字符数组来存储字符串*/
fgets(str, 7, stdin); /*从输入流stdin即输入缓冲区中读取7个字符到字符数组str中 但注意不会删除回车字符*/

如果是读入字符串 getline <cstring>

string s;
getline(cin, s);

string

<string>
标准库类型 可变长的字符序列
具体用法见讲义5字符串

算法

高精度

把数字的每一位存到数组里 通常把各位存到a[0]

//计算2的n次方 n<=10000  

#include<iostream>

using namespace std;

int main()
{
	int a[10010] = { 1 };
	int n;
	cin >> n;
	int m = 1;
	for (int i = 0; i < n; i++)
	{
		int t = 0;
		for (int j = 0; j < m; j++)
		{
			t += a[j] * 2;
			a[j] = t % 10;
			t /= 10;
		}
		if (t)a[m++] = 1;
	}
	for (int i = m - 1; i >= 0; i--)cout << a[i];
	cout << endl;
	return 0;
}