算法练习
今天练习了两道算法题目
1、100!的正约数个数
首先明白怎样计算一个数的正约数个数,以180举例
100!数目相对来说比较大,我使用180这个数来分析。
第一步:找出180以内的所有质数,(1不是质数)
180的约数【2,3,5,7,11,13,17…】
第二步:
如180=2* 2* 3* 3* 5
180的约数个数为(1+2)(1+2)(1+1)=18个。
也就是说找出每一个180除以每一个质数所得的幂在加一相乘。
这个方法使用了小学学习的求约数的算式
package moni; import java.math.BigInteger; public class yueshu { public static void main(String[] args) { long count = 0; long zong = 1; BigInteger sum = new BigInteger(factorial(100));//100的阶乘计算 for (long i = 1; i <= sum.bitLength(); i++) { if (sum.byteValue() % i == 0) { count++; } zong *= count; } System.out.println(zong); } public static String factorial(int count) {//定义一个单独的方法计算阶乘 BigInteger result = new BigInteger(String.valueOf(1)); for (int i = 1; i <= count; i++) { BigInteger i_value = new BigInteger(String.valueOf(i)); result = result.multiply(i_value); } return result.toString(); } }
2、粘木棍问题,有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
第一行两个整数N,M。 一行N个整数,表示木棍的长度。
一行一个整数,表示最小的差距
我首先想到的是Arrays.sort()方法,先将木棍的长度进行排序,然后再定义一个数组,将长的木棍放入该数组,最后将最短的木棍加入最长的木棍上面,最后相减即可
package algorithm; import java.util.Arrays; import java.util.Scanner; //粘木棍 public class lianxi09 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[] array = new int[n]; for (int i = 0; i < array.length; i++) { array[i] = sc.nextInt(); } Arrays.sort(array);// 对木棍的长度进行排序 int[] chang = new int[m];// 新建长木棍数组 for (int i = n - 1; i >= 0; i--) { for (int j = m - 1; j >= 0; j--) { chang[j] = array[i]; } } for (int i = n - m - 1; i >= 0; i--) { chang[0] += array[i]; Arrays.sort(chang); } System.out.println(chang[m - 1] - chang[0]); } }