publicclassMain { static ArrayList<Integer> list = newArrayList<>();
publicstaticvoidmain(String[] args) { getDivides(100); Collections.sort(list); for (int a : list) { System.out.print(a + " "); } }
staticvoidgetDivides(int n) { for (inti=1; i <= n / i; i++) { if (n % i == 0) { list.add(i); if (i != n / i) list.add(n / i); } } } }
约数个数
任何一个大于1的自然数 ,如果N不为质数,都可以唯一分解成有限个质数的乘积
其中
且均为质数
定理应用
一个大于1的正整数N,如果它的标准分解式为:
那么它的正因数个数为
它的全体正因数之和为
在分解质因数的时候,我们其实就已经求出了任意正整数N的标准分界式
1 2 3 4 5 6 7 8 9 10 11 12 13
staticintgetNumOfFactors(int n) { intres=1; for (inti=2; i <= n / i; i++) { inta=0; while (n % i == 0) { n /= i; a++; } res *= (1 + a); } if (n > 1) res *= 2; //如果存在唯一一个大于sqrt(n)的因数,那么其上标只能为1,带入到公式也就是乘上(1 + 1) = 2 return res; }
1 2 3 4 5 6 7 8 9 10 11 12 13
staticvoiddivide(int n) { for (inti=2; i <= Math.sqrt(n); i++) { if (n % i == 0) { intcount=0; while (n % i == 0) { count++; n /= i; } System.out.println(i + " " + count); } } if (n > 1) System.out.println(n + " " + 1); }
为了和下面的约数之和统一一下版本,写了个Hashmap版的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
staticintgetNumOfFactors(int x) { intres=1; HashMap<Integer, Integer> map = newHashMap<>(); for (inti=2; i <= x / i; i++) { intcount=0; while (x % i == 0) { x /= i; count++; } map.put(i, count); } if (x > 1) map.put(x, 1); for (int c : map.values()) { res *= c + 1; } return res; }