随笔分类 -  算法

摘要:步骤 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 若已排序元素大于新元素,将新元素前移一位 重复步骤3,直到找到已排序元素小于或等于新元素位置 将新元素插入该位置 重复2—5步骤 代码 void InsertionSort (ont *a, int 阅读全文
posted @ 2021-07-31 22:49 白藏i 阅读(39) 评论(0) 推荐(0)
摘要:步骤 两两比较相邻元素 ai 和 ai+1 (i = 1, 2, ···, n -1),若ai > ai+1,则交换ai 和 ai+1的位置; 对剩下的n - 1个元素,再两两进行比较,按同样规则交换它们的位置,经过n - 2次比较,将最大值交换到 an-1 的位置; 如法炮制,经过n - 1 趟的 阅读全文
posted @ 2021-07-31 22:37 白藏i 阅读(50) 评论(0) 推荐(0)
摘要:使用前提 数组已经按升序排列 基本原理 首先将要查找的元素(key)与数组的中间元素比较 如果key小于中间元素,只需在数组的前一半元素中继续查找 如果key和中间元素相等,匹配成功,查找结束 如果key大于中间元素,只需在数组的后一半元素中继续查找 阅读全文
posted @ 2021-07-31 22:13 白藏i 阅读(28) 评论(0) 推荐(0)
摘要:海伦公式 double a, b, c; //三条边的边长 double s, area; if (a + b > c && b + c > a && a + c > b) //三角形判断 { s = (a + b + c) / 2; //s为周长的一半 area = sqrt(s * (s - a 阅读全文
posted @ 2021-07-31 20:47 白藏i 阅读(95) 评论(0) 推荐(0)
摘要:向量积(叉积) 令 原点为A,B和C在向量a和向量b上(哪一点在哪个向量上不确定) 根据“右手法则”, 向量 AB x 向量 AC 的结果为正时,ABC顺序为逆时针;反之,结果为负时,ABC为顺时针。 代码 int main() { double x1, y1, x2, y2, x3, y3; wh 阅读全文
posted @ 2021-07-31 20:39 白藏i 阅读(87) 评论(0) 推荐(0)
摘要:求ab % c 的值。其中a, b, c 是整数,且 0 < a,c < 109,0 < b < 1018 暴力算法 O(b) long long ans = 1; for (long long i = 1; i <= b; i++) { ans *= a; } ans % c; 优化(暴力算法) 阅读全文
posted @ 2021-07-31 20:21 白藏i 阅读(131) 评论(0) 推荐(0)
摘要:Def 给定一个正整数m,如果两个整数a和b满足 a - b 能被m整除,即(a - b) / m 得到一个整数,那么就称整数a 与 b对模 m 同余。 记作:a ≡ b(mod m) 【对模m同余的整数是一个等价关系】 读作:a同余于b模m(或 a 与 b 对模 m 同余) eg:26 ≡ 2 ( 阅读全文
posted @ 2021-07-31 13:57 白藏i 阅读(341) 评论(0) 推荐(0)
摘要:例子:若初始序列123456(是第一个),求问107个是? 107 - 1 = 106 ①106 / 4!= 4 ······10 即,1 2 3 4 5中有四个比它小,所以第一位是5 ②10 / 3!= 1······4 即,1 2 3 4 中有一个比它小,所以第二位是2 ③4 / 2!= 2·· 阅读全文
posted @ 2021-07-31 13:24 白藏i 阅读(56) 评论(0) 推荐(0)
摘要:Def 康托展开是一个全排列到一个自然数的双射。实质是计算当前全排列在所有有小到大全排列中的顺序,可逆。 公式: X = An (n - 1)! + An - 1 (n - 2)! + ··· + A1· 0! eg: [5 2 4 1 3]是序号几 ①首位为5:当首位取1或2或3或4时,剩下的数不 阅读全文
posted @ 2021-07-31 12:51 白藏i 阅读(99) 评论(0) 推荐(0)
摘要:试除法 O(√n) bool isPrime (int x) //x是否为素数 { for (int i = 2; i < x; i++) { if (x % i == 0) return false; } return true; } 改进: 寻找x是否存在新的因子,设新的因子为a, 则可求出另一 阅读全文
posted @ 2021-07-31 12:13 白藏i 阅读(75) 评论(0) 推荐(0)
摘要:int reser (int x) //把x倒过来 { int _x = 0; while (x != 0) { _x = _x * 10 + x % 10; x /= 10; } return _x; } bool isHW (int num) //判断是否回文 { if (num == rese 阅读全文
posted @ 2021-07-31 09:40 白藏i 阅读(54) 评论(0) 推荐(0)
摘要:Def: 用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数为0。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 eg:1997和615的最大公约数? 1997 / 615 = 3······152 615 / 阅读全文
posted @ 2021-07-31 09:31 白藏i 阅读(54) 评论(0) 推荐(0)