0

これはある数の約数を数えるプログラムですが、その数の実際の数よりも 1 つ少ない約数を与えています。

#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 もまた n の約数であるということです。p が n の平方根でない場合は常に、分割テストごとに 1 つではなく 2 つの除数が得られます。

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 テストは 2 番目の除算よりもはるかに安価です。

PS: 除数のリストが必要な場合は、ループ内で i および j の値として表示されます。n が正方形の場合は、おそらく最後に i==j==sqrt(n) の値として表示されます。

于 2013-08-25T03:24:08.140 に答える