0

这是一个计算一个数字的除数的程序,但它给出的除数比该数字的实际除数少一个。

#include <stdio.h>

int i = 20;
int divisor;
int total;

int main()
{
    for (divisor = 1; divisor <= i; divisor++)
    {
        if ((i % divisor == 0) && (i != divisor))
        {
            total = total++;
        }
    }
    printf("%d %d\n", i, total);
    return 0;
}

数字 20 有 6 个除数,但程序说有 5 个除数。

4

3 回答 3

5
&& (i != divisor)

意味着20不会被视为除数。如果你想考虑它,放弃那段代码,你会得到整套,{1, 2, 4, 5, 10, 20}.

即使您希望将数字计为除数,您仍然可以放弃该代码并仅在语句中使用<而不是。<=for

和:

total = total++;

完全没有必要。它甚至可能是未定义的,我只是懒得检查,这并不重要,因为没有人长时间编写这样的代码:-)

使用任一:

total = total + 1;

或更好):

total++;
于 2013-08-24T22:00:12.317 回答
1

除数计数可能比其中任何一个都更简单,而且肯定更快。需要注意的关键事实是,如果 p 是 n 的除数,则 n/p 也是如此。每当 p 不是 n 的平方根时,每个除法测试都会得到两个除数,而不是一个。

int divcount(int n)
{
    int i, j, count=0;
    for (i=1, j=n; i<j; j = n/++i)
    {
        if (i*j == n)
            count += 2;
    }
    if (i == j && i*j == n)
        ++count;
    return count;
}

这可以通过 sqrt(n) 除法和 sqrt(n) 乘法完成工作。我之所以选择它是因为,虽然 j=n/i 和另一个 j%i 可以在大多数 CPU 上使用一条除法指令来完成,但我还没有看到编译器采用这种优化。由于在现代桌面处理器上乘法是单时钟的,所以 i*j == n 测试比二次除法便宜得多。

PS:如果您需要一个除数列表,它们会在循环中作为 i 和 j 值出现,如果 n 是一个正方形,则可能作为最后的 i==j==sqrt(n) 值。

于 2013-08-25T03:24:08.140 回答
0

&& (i != divisor)如给定答案中所述,您已添加额外检查。

在这里,我使用素因数分解编写了相同的程序。这是找到大数除数的快速方法(参考)。

// this function return the number of divisor for n.
// if n = (m^a) (n^b) ... where m, n.. are prime factors of n
// then number of divisor  d(n) = (a+1)*(b+1)..
int divisorcount(int n){

  int divider = 2;
  int limit = n/2;
  int divisorCount = 1;
  int power = 0;

  // loop through i=2...n/2
  while(divider<=limit){
    if(n%divider==0){
      // dividing numper using prime factor
      // (as smallest number devide a number 
      // is it's prime factor) and increase the
      // power term for prime factor.
     power++;
     n/=divider;
    }
    else{
      if(power != 0){
        // use the prime factor count to calculate
        // divisor count.
        divisorCount*=(power+1);
      }
      power = 0;
      divider++;
    // if n become 1 then we have completed the 
    // prime factorization of n.
    if(n==1){
      break;
    }

    }
  }
return divisorCount;
}
于 2013-08-24T23:34:13.513 回答