Java 计算所有数字的除数,直到N
我需要计算Java 计算所有数字的除数,直到N,java,algorithm,math,Java,Algorithm,Math,我需要计算1到n范围内每个数字的所有除数。我在下面写了一个实现,给定一个整数num,它计算num的除数。它的复杂性是O(sqrt(n))。因此,总的来说,复杂性是O(n*sqrt(n))。可以减少吗?如果是,那么你能给出一个算法吗 代码: public static int countDivisors(int num) { int limit = (int)Math.sqrt(num); int count = 2; for(int i
1到n范围内每个数字的所有除数。我在下面写了一个实现,给定一个整数num
,它计算num
的除数。它的复杂性是O(sqrt(n))
。因此,总的来说,复杂性是O(n*sqrt(n))
。可以减少吗?如果是,那么你能给出一个算法吗
代码:
public static int countDivisors(int num)
{
int limit = (int)Math.sqrt(num);
int count = 2;
for(int i = 2 ; i <= limit ; i++)
{
if(num % i == 0)
{
count++;
if(num / i != i)
{
count++;
}
}
}
return count;
}
公共静态int countdivisions(int num)
{
int limit=(int)Math.sqrt(num);
整数计数=2;
对于(int i=2;i),可以通过简单的迭代,比O(n.qRT(n)) >好得多。代码是C++的,但是您可以很容易地得到这个想法。
#include <iostream>
#include <vector>
using namespace std;
void CountDivisors(int n) {
vector<int> cnts(n + 1, 1);
for (int i = 2; i <= n; ++i) {
for (int j = i; j <= n; j += i) {
cnts[j]++;
}
}
for (int i = 1; i <= n; ++i) {
cout << cnts[i] << " \n"[i == n];
}
}
int main() {
CountDivisors(100);
return 0;
}
#包括
#包括
使用名称空间std;
无效计数因子(整数n){
载体碳纳米管(n+1,1);
对于(int i=2;i您可以使用一种广义的方法改进这种简单的方法。不只是将数字标记为复合数,还可以存储您找到的第一个除数(我在下面的computeDivs函数中这样做)
主类
{
//使用埃拉托斯坦筛对所有数字进行因式分解
公共静态int[]计算的iv(int大小){
int[]divs=新的int[size+1];
对于(int i=0;i 对于(inti=2;i),这段代码似乎正在工作,因此可能更适合于“可以减少吗?”是的。这就是你想知道的吗?@Andreas,我已经编辑了这个问题。如果可以减少,那么你能提供一个算法吗?你有没有尝试过谷歌,比如使用你的问题的标题?---我最喜欢的链接是@Andreas,因为这是一个单一的测试用例-你必须在Ivaylo上大量计算n到n的所有数字除数。这个你的答案帮助我学到了很多。谢谢阿卜杜拉。这个算法肯定比我的快。但我已经把其他答案标记为正确的,因为我认为它更快。我建议你也研究一下
class Main
{
// using Sieve of Eratosthenes to factorize all numbers
public static int[] computeDivs(int size) {
int[] divs = new int[size + 1];
for (int i = 0; i < size + 1; ++i) {
divs[i] = 1;
}
int o = (int)Math.sqrt((double)size);
for (int i = 2; i <= size; i += 2) {
divs[i] = 2;
}
for (int i = 3; i <= size; i += 2) {
if (divs[i] != 1) {
continue;
}
divs[i] = i;
if (i <= o) {
for (int j = i * i; j < size; j += 2 * i) {
divs[j] = i;
}
}
}
return divs;
}
// Counting the divisors using the standard fomula
public static int countDivisors(int x, int[] divs) {
int result = 1;
int currentDivisor = divs[x];
int currentCount = 1;
while (currentDivisor != 1) {
x /= currentDivisor;
int newDivisor = divs[x];
if (newDivisor != currentDivisor) {
result *= currentCount + 1;
currentDivisor = newDivisor;
currentCount = 1;
} else {
currentCount++;
}
}
if (x != 1) {
result *= currentCount + 1;
}
return result;
}
public static int countAllDivisors(int upTo) {
int[] divs = computeDivs(upTo + 1);
int result = 0;
for (int i = 1; i <= upTo; ++i) {
result += countDivisors(i, divs);
}
return result;
}
public static void main (String[] args) throws java.lang.Exception {
System.out.println(countAllDivisors(15));
}
}