数学
曼哈顿距离
棋盘格上判断某个点到基准点的横纵距离之和
一般竖着是x轴 横着是y轴 因为多维数组是一行行的
//输入一个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为复制长度(单位是字节)
字符串函数
读入字符串
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;
}