Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算所有数字的除数,直到N_Java_Algorithm_Math - Fatal编程技术网

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));
    }
}