算法模板
文章平均质量分 75
Ntses
寂静的时候最容易孕育新生
展开
-
关于n的阶乘的有关问题
对于给定的整数n,当n较大时,n!的计算就很复杂,需要通过高精度计算得到结果,显然得到的n!的位数很多。所以定义n的时候最好用long,一般涉及n!的问题有:n!尾部的0的个数是多少? n!是多少位数字? n!最前面的一位数字是几?给定自然数n,依次输出上述3个数值。0<n<.(1!=1,2!=2,3!=6,4!=24,5!=120,6!=720,7!=5040,....)分析n!尾部0的个数是多少:n!可以写为n!=a*10^m.其中,m是n!尾部0的个数,而a是一个原创 2022-04-02 23:57:01 · 471 阅读 · 0 评论 -
图形矩阵(回型&蛇型)
回型矩阵回形矩阵有n行n列;数字按顺时针或者逆时针递增。第一圈:上边界:y不变,x++;右边界:x不变,y++;下边界:y不变,x--;左边界:x不变,y--第二圈:上边界:y+1不变,(x+1)++;右边界:x+1不变,(y+1)++;下边界:y+1不变,(x+1)--;左边界:x+1不变,(y+1)-- static void printN(int n) { int[][] arr = new int[n][n]; int count = 1;原创 2022-04-01 09:43:20 · 2419 阅读 · 0 评论 -
全排列(排列数字)
。先举个例子:1,2,3的全排列有{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。 共6种,这是一个简单的排列组合问题,算法思路:dfs+回溯 。在构造树的过程中dfs,将搜索到的节点入栈(回溯)。栈的作用就是回溯,每访问一个节点-入栈,每退回一个节点-出栈。如果访问到叶子节点就直接输出栈中的所有元素,实现全排列。而在使用递归式时,系统会调用一个叫系统栈的东西来存放递归中每一层的状态,因此使用递归来实现dfs的本质还是栈。那么实现代码的具体思路原创 2022-03-31 07:06:09 · 1167 阅读 · 0 评论 -
质数的判定及筛选
我们都知道在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,也叫素数。质数的判定:我们一开始所选用的最原始的方法如下:boolean is_prime(int n){ if(n<2) return false; for(int i=2;i<n;i++){ if(n%i==0){ return false; } } return true;}这里补充一个新的判定方法——试除法原创 2022-03-29 21:41:24 · 265 阅读 · 0 评论 -
快速幂与矩阵快速幂
模计算除以m的余数,叫做对m取模将a,b对m取模的结果相同,记为a≡b(mod m),即a mod m == b mod m如果a≡b(mod m),且c≡d(mod m):a+b ≡ c+d (mod m)a*b ≡ c*d (mod m)模幂运算模幂运算就是在一个模下计算一个幂的值(先进行幂运算,再进行模运算),即计算(a^r) mod m (a,r和m是正整数)(1)模幂运算1——累次计算法:d=(a^r)mod m =(…((((a mod m)* a).原创 2022-03-28 11:21:34 · 529 阅读 · 0 评论 -
关于枚举法及组合型、排列型枚举模板
枚举法枚举算法的思想:将问题的所有可能成为答案的解一一列举,然后根据问题所给出的条件判断此解是否合适,如果合适就保留,反之舍弃。枚举算法解题的基本思路:确定枚举解的范围,以及判断条件 选取合适枚举方法,进行逐一枚举,此时应注意能否覆盖所有的可能的解 在枚举时使用判断条件检验,留下所有符合要求的解。枚举算法的一般步骤:根据题目确定枚举的范围,并选取合适的枚举方式,不能遗漏任何一个真正解,同时避免重复。 为了提高解决问题的效率,看题目是否存在优化,将可能成为解的答案范围尽可能的缩小。原创 2022-03-26 21:54:36 · 2476 阅读 · 0 评论 -
基于快排的一些优化
在之前我有分享过关于排序算法的学习笔记,里面有提及快速排序。但是在之后发现之前提供的不过是普通快排算法,而在面对一些特殊情况时(例如序列原本就有序、有大量重复元素等等)会进行很多完全不必要的操作,耗费大量时间。为此,学习了一下基于普通快速排序算法一步步进行优化。为了方便阅读,我还是把普通快排的代码放出来吧。 public class qSort { public static void qSort(int[] arr,int low,int high){ int i,j,temp,t;原创 2022-03-22 09:12:44 · 125 阅读 · 0 评论 -
欧几里德算法及其扩展
欧几里德算法其实就是辗转相除法,求最大公因数。具体做法是:用较大数除以较小数,再用所得的余数(第一余数)去除除数,再用所得的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是这两个数的最大公约数。记gcd(a,b)为整数a和b的最大公因数。public static int gcd(int m,int n){ return n == 0 ? m :gcd(n,m%n);}欧几里德算法的扩展——裴蜀(贝祖)等式对任何整数a,b和它们的最大公约数d,关于原创 2022-01-29 23:57:47 · 440 阅读 · 0 评论 -
运用位运算解题
位运算符在处理整形数值时,可以直接对组成整形数值得各个位进行操作。位运算有:& 与 两个位都为1时,结果才为1| 或 两个位都为0时,结果才为0^ 异或 两个位相同为0,相异为1~ 取反 0变1,1变0>>和<<运算符将二进制位进行右移或者左移操作使用位运算判断数的奇偶性要知道奇数最后一位二进制为 1,偶数最后一位二进制为 0public static boolean isOdd(int i){ //原创 2022-02-12 16:21:00 · 216 阅读 · 0 评论 -
三角形面积计算
已知三条边和外接圆半径,公式为s=a*b*c/(4*R)doubleGetArea(doublea,doubleb,doublec,doubleR){returna*b*c/4/R;}已知三条边和内接圆半径,公式为s=prdoubleGetArea(doublea,doubleb,doublec,doubler){returnr*(a+b+c)/2;}已知三角形三条边,求面积先判断输入的三边数值是否可以构成三角形(两边之和大...原创 2022-02-28 23:33:50 · 1365 阅读 · 0 评论