网站前端需要会什么这样可以做网站

当前位置: 首页 > news >正文

网站前端需要会什么,这样可以做网站,创什么网站吸引人,门户网站跳出率初等数论 模 取余#xff0c;遵循尽可能让商向0靠近的原则#xff0c;结果的正负和左操作数相同 取模#xff0c;遵循尽可能让商向负无穷靠近的原则#xff0c;结果的正负和右操作数相同 7/#xff08;-3#xff09;-2.3#xff0c;产生了两个商-2和-3#xff0c;取…初等数论 模 取余遵循尽可能让商向0靠近的原则结果的正负和左操作数相同 取模遵循尽可能让商向负无穷靠近的原则结果的正负和右操作数相同 7/-3-2.3产生了两个商-2和-3取余语言中取-2导致余数为1取模语言中取-3导致余数为-2 java中%是取余 幂 1、暴力幂 思想直接将a连续乘以b遍 时间复杂度On 空间复杂度O1 // 求 a^bpublic long pow(int a, int b){long ans 1;for (int i 0; i b; i) {ans * a;}return ans;}2、快速幂 思想利用幂的2进制形式来加速运算。 时间复杂度O(log₂N) 空间复杂度O1 // 求 a^bpublic long pow(int a, int b){long ans 1;// 不断取幂的二进制形式中的最后一位并且将b不断右移将b最后一位抛弃直到幂最后变为0while(b 0){// 当前幂的最后一位为1表明需要将该结果添加到最终的结果中由于是幂中的实际上操作为乘法if((b 1) 1){ans * a;}// 将底数变为原底数的二次方a * a;// 抛弃幂二进制形式的最后一位b 1;}return ans;}例子 3 5 3 101 3 1 ∗ 2 3 0 ∗ 2 2 1 ∗ 2 0 3 1 ∗ 2 3 ∗ 3 0 ∗ 2 2 ∗ 3 1 ∗ 2 0 3^{5}3^{101}3^{1*2^{3}0*2^{2}1*2^{0}}3^{1*2^{3}}*3^{0*2^{2}}*3^{1*2^{0}} 35310131∗230∗221∗2031∗23∗30∗22∗31∗20 3、Math类 // 求 a^b // java.lang.Math // double pow(double a, double b) Math.pow(a, b)可以支持浮点数的幂 补充 结果%c 原理多个数的积%c等于下列操作和的结果 每个乘项%c最终积%c // 求 a^b%cpublic long pow(int a, int b, int c){long ans 1;// 不断取幂的二进制形式中的最后一位并且将b不断右移将b最后一位抛弃直到幂最后变为0while(b 0){// 当前幂的最后一位为1表明需要将该结果添加到最终的结果中由于是幂中的实际上操作为乘法if((b 1) 1){ans (ans*a)%c;}// 将底数变为原底数的二次方a (a*a)%c;// 抛弃幂二进制形式的最后一位b 1;}return ans%c;}对数 1、Math类 //java.lang.Math double log(double a) //以e为底 double log10(double a) //以10为底Math.log(n); Math.log10(n);可以求浮点数的对数 2、朴素 public static int logN(int base, int n) {int power 0;while (n / base 0) {n n / base;power;}return power;}//log2public int log2(int n) {int power 0;while ((n n 1) 0) {power;}return power;}矩阵 1、单位矩阵 单位矩阵的对角线上的元素全为1其他的元素全为0 public int[][] unit(int n){int[][] resnew int[n][n];for(int i0;in;i){res[i][i]1;}return res;}2、乘法 public int[][] multiplyMatrix(int x1[][],int x2[][]){//第一个矩阵的列必须等于第二个矩阵的行if(x1[0].length!x2.length){return;}int lineLengthx1.length; //第一个矩阵的行int listLengthx2[0].length;//第二个矩阵的列int[][] multiplynew int[lineLength][listLength];//相乘的结果矩阵for(int i0;ilineLength;i){for(int j0;jlistLength;j){for(int k0;kx1[0].length;k){multiply[i][j]x1[i][k]*x2[k][j];}}}return multiply;}矩阵%c等于矩阵上的每一个元素都%c 3、快速幂 类似于整数的快速幂不同的是1的表示矩阵中为单位矩阵以及乘法的定义 // 求 a^bpublic int[][] pow(int[][] A, int b){int[][] ans unit(A.length);// 不断取幂的二进制形式中的最后一位并且将b不断右移将b最后一位抛弃直到幂最后变为0while(b 0){// 当前幂的最后一位为1表明需要将该结果添加到最终的结果中由于是幂中的实际上操作为乘法if((b 1) 1){ans multiplyMatrix(ans,a);}// 将底数变为原底数的二次方a multiplyMatrix(a,a);// 抛弃幂二进制形式的最后一位b 1;}return ans;}素数质数 质数是指在大于1的整数中除了1和它本身以外不再有其他因数的自然数。 合数是指在大于1的整数中除了能被1和本身整除外还能被其他数0除外整除的数。 1既不属于质数也不属于合数。最小的合数是4最小的质数是2 1、朴素 boolean isPrime(int n){for(int i2;i*in;i){if(n%i0){return false;}}return true; }2、埃氏筛法 //埃氏筛选法public void eratosthenes(int n) {boolean[] isPrime new boolean[n1];//false代表是素数true代表的是合数for (int i 0; i n; i) {if(i2){isPrime[i]true;continue;}//如果是素数if (!isPrime[i]) {//将该素数的所有倍数都标记为合数for (int j 2 * i; j n; j i) {isPrime[j] true;}}}}埃拉托斯特尼筛法简称埃氏筛或爱氏筛要得到自然数n以内的全部素数必须把不大于 根号n 的所有素数的倍数剔除剩下的就是素数。 时间复杂度O(nloglogn) 不足之处6 在 indexI 2 时被标记而在 indexI 3 时又被标记了一次。存在重复标记有优化空间 3、欧拉筛 欧拉筛是对埃氏筛的改进避免重筛提高效率 //欧拉筛选法public void euler(int n) {//建立一个bool类型的数组以下标为要判断的数字 以该下标的值为素数的标志//若i是素数 则 isPrime[i]falseboolean[] isPrime new boolean[n1];isPrime[0] isPrime[1] true;//数字0和1都不是素数所以赋trueint[] Prime new int[n1];//存放素数的数组int t 0;Prime[t] 2;//把2放进素数表for (int i 2; i n; i) {if (!isPrime[i])//若当前数是素数Prime[t] i;//则存入素数数组// 每一个数都去乘以当前素数表里面已有的数如果 indexI 是合数且 indexI % primeList[indexJ] 0那么它只能乘以第一个素数 2for (int j 0; j t Prime[j] * i n; j) {isPrime[i * Prime[j]] true;// 保证了每个合数只会被它的最小素因子筛掉,避免重筛,使得程序更有效率if (i % Prime[j] 0)break;}}}欧拉筛法保证每个合数只会被它的最小质因数筛掉时间复杂度降低到O(n)。 每一个数都去乘以当前素数表里面 小于等于最小素因子的数 最大公因数gcd 最大公约数Greatest Common Divisor 1、辗转相除法欧几里得 思想两个正整数a和ba b它们的最大公约数gcd等于a除以b的余数r和b之间的最大公约数。辗转相除法的算法流程可以如下 计算a与b的余数r。如果r为0则返回gcd b。否则转到步骤3。使用b的值更新a的值使用余数r更新b的值转到步骤1。 int gcd(int x, int y) {return x 0 ? y : gcd(y % x, x); }int gcd(int a, int b){if (b 0)return a;elsereturn gcd(b, a%b); }int gcd(int a, int b){int temp;while(b!0){tempa%b;ab;btemp;}return a; }根本无需判断a和b的大小当a值小于b值时算法的下一次递归调用就能够将a和b的值交换过来 2、更相减损术 思想两个正整数a和ba b它们的最大公约数等于a-b的差值c和较小数b的最大公约数。依次递归下去直到两个数相等。这相等两个数的值就是所求最大公约数。 int gcd(int x, int y) {if (xy)return x;else if (xy)return gcd(x-y,y);else return gcd(y-x,x); }更相减损法和辗转相除法的思想较为接近不同的是辗转相除法迭代更快而更相减损法迭代慢。但后者使用的是减法前者使用的是求余前者损耗较低。在两数相差较大时避免使用更相减损法而在大数是避免使用辗转相除法。 最小公倍数lcm 1、加穷举法 将大数依次乘NN为从1开始的自然数对得到的数判断其是否整除小数。 2、乘穷举法 将大数依次加1对得到的数判断其是否可整除两数。 3、最大公因数法最优 l c m ( a , b ) ∣ a ⋅ b ∣ g c d ( a , b ) lcm(a,b)\frac{∣a⋅b∣}{gcd(a,b)} lcm(a,b)gcd(a,b)∣a⋅b∣​ int lcm(int a, int b) {return a * b / gcd(a, b); }