- 博客(12)
- 收藏
- 关注
原创 辗转相除法求最大公约数
辗转相除法(欧几里得算法)的核心思想是:两个整数的最大公约数等于较大数与较小数取模后的余数的最大公约数。- 时间复杂度:O(log(min(a, b))),例如计算 gcd(10^18, 10^18−1)仅需约60步。当余数为0时,此时的除数 6 即为最大公约数。
2025-04-09 22:23:49
372
原创 线性——埃氏筛
内层循环优化:从 i² 开始标记,避免重复处理已被更小质数筛除的合数(如 i=5 时,跳过 5×2=10 和 5×3=15 )它通过从小到大的素数依次筛除其倍数,最终剩下的未被标记的数即为素数。1. 重复标记问题:某些合数会被多个质因子重复标记(如30被2、3、5各筛一次),但时间复杂度仍可控。外层循环优化:仅遍历到 √n ,因为若一个数 n 是合数,其最小质因子必不超过 √n。- 每个合数只会被其最小质因子筛除一次(如12会被2筛除,而非3或4)。- 素数3会筛除9、15、21等3的倍数;
2025-04-09 22:10:04
230
原创 线性—欧拉筛
例如,当 i=4 时, primes[j]=2 ,若继续用 primes[j]+1=3 相乘得到 12 ,但 12 的最小质因子是2,应在 i=6 时由 2*6 筛除。而欧拉筛(又称线性筛)通过确保每个合数仅被其最小质因子筛除一次,将时间复杂度优化至 O(n),成为解决大规模素数筛选问题的利器。- 合数12的最小质因子是2,因此它只会在外层循环遍历到6(即 6*2 = 12)时被筛除。双重循环的作用:外层遍历每个数,内层用已知素数筛选合数,确保每个合数仅被标记一次。
2025-04-09 21:49:39
502
原创 c语言高精度算法(减法)
如果 a 的当前位 a[i] 小于 b 的当前位 b[i] ,则需要向高位借位: a[i + 1]--;- 从低位到高位遍历结果数组 c 的每一位(索引 i 从 0 到 lenc - 1 )。long long的范围是-2的63次方到2的63次方-1,数量级为10的18次方。int的范围是-2的31次方到2的31次方-1,数量级为10的9次方。- 计算当前位的差: c[i] = a[i] - b[i];如果超出该数量级,就要用高精度算法。我们可以用数组来进行高精度运算。
2025-04-02 21:27:07
222
原创 bfs的简单例题
检查相邻位置是否可访问:对每个相邻位置进行检查,若该位置超出地图边界、是障碍物(字符为 # )或者已被访问过(标记数组 st 中对应位置为 true ),则跳过该位置;小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。- 取出当前位置:从队列中取出队首位置(当前要处理的位置),并记录其坐标 x 和 y。
2025-04-02 21:15:21
695
原创 dfs简单例题
通过深度优先搜索算法,对一个 n x n 的二维数组进行处理。从起始点 (0, 0) 开始,将所有可达的且值为 0 的位置标记为 3 ,(也就是染色)然后根据标记情况输出处理后的数组;由数字 0 组成的方阵中,有一任意形状的由数字 1 构成的闭合圈。如果从某个 0 出发,只向上下左右 4 个方向移动且仅经过其他 0 的情况下,无法到达方阵的边界,就认为这个 0。接下来 n 行,由 0 和 1 组成的 n×n 的方阵。的 0 是连通的(两两之间可以相互到达)。(对于 100% 的数据,1≤n≤30)
2025-04-01 20:05:41
176
原创 c语言高精度算法(高精除低精)
c[i]=(t*10+a[i])/b 计算当前这一位的商, t 是上一次计算留下的余数,乘以 10 后加上当前位的数字 a[i] 组成新的被除数,再除以 b 得到商存到 c[i] 中。t=(t*10+a[i])%b 计算新的余数,同样是用新组成的被除数对 b 取余,更新 t 的值,以便下一次计算使用。long long的范围是-2的63次方到2的63次方-1,数量级为10的18次方。int的范围是-2的31次方到2的31次方-1,数量级为10的9次方。我们可以用数组来进行高精度运算。
2025-03-26 20:30:19
184
原创 c语言高精度算法(乘法)
以我们以前学过的加法竖式为例,a[i]和b[i]相乘,得到c[i],如果相加结果>=10,需要向前一位(c[i+j+1])进一。c[i+j]+=a[i]*b[j] 这一位的结果=这一位a*b的结果+上一位>=10部分的进位。long long的范围是-2的63次方到2的63次方-1,数量级为10的18次方。c[i+j+1]+=c[i+j]/10 上一位>=10要向下一位进位。int的范围是-2的31次方到2的31次方-1,数量级为10的9次方。c[i+j]%=10 每一位>=10时只取个位。
2025-03-26 20:18:37
172
原创 c语言高精度算法(加法)
如果要实现1234567和98765的相加,可以把1234567和98765存入数组,为了在竖式中让两个数的末位对齐,我们要将两个数倒过来存储。以我们以前学过的加法竖式为例,a[i]和b[i]相加,得到c[i],如果相加结果>=10,需要向前一位(c[i+1])进一。c[i]+=a[i]+b[i] 这一位的结果=这一位a+b的结果+上一位>=10部分的进位。long long的范围是-2的63次方到2的63次方-1,数量级为10的18次方。c[i+1]=c[i]/10 上一位>=10要向下一位进位。
2025-03-26 19:56:31
183
原创 字符串空格处理
去除字符串中多余的空格,例如"l am a student."2.利用while(cin>>op)来处理空格。不过用该方法需要用Ctrl +Z来结束程序。默认是以空格来分割字符串的,利用。
2025-03-19 21:45:57
257
1
原创 算法-大O法
O(n2+n+1)=O(n2).(高次项影响远大于低次项)O(5n)=O(n).(常数因子对增长率的影响可以忽略)如果一个算法包含嵌套步骤,总复杂度是各步骤复杂度的乘积。用“肉眼”得到算法代码执行的时间。总复杂度等于量级最大的那段代码的复杂度。一. 大O法是什么?常忽略常数因子,低次项。因为对于足够大的 n 时。
2025-03-19 18:22:17
163
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅