割り当ては、整数kを読み込み、正確にk個の除数を持つ正の整数 を1〜100000(両端を含む)の数だけ出力します。たとえば、番号24には、 1,2,3,4,6,8,12,24の8つの約数があります。このプログラムをより速くするにはどうすればよいですか?
私は実行中のプログラムを持っていますが、検索が高速になる可能性がありますか? ?
#include <stdio.h>
#include <math.h>
int main(void)
{ int a; //user input//
int divisors; //running total of number of divisors//
int sum; //running total of numbers with the required number of divisors//
printf("Enter the target number of divisors:");
scanf("%d", &a);
printf("\n");
int i;
for (i=1; i<=100000; i++)
{
divisors=2;
int p;
for(p=2; p<i; p++)
{if (i%p==0)
divisors++;}
if (divisors==a)
sum++;}
printf("There are %d numbers between 1 and 100000 inclusive which have exactly %d divisors.", sum, a);
return 0;
}
これは古典的です。 sqrt(i)までループし、除数が見つかった場合は、それが同じでない限り、もう1つを加えます(完全な正方形の場合)。 –
私は、私が平方根までループを実装するたびに、私はプログラムを実行するたびに不正確で異なる数の除数を返します。 –
重複したリンクを確認して、あなたの質問が重複していると受け入れます。これをスピードアップするには、int(sqrt(n))が含まれるまでループする必要がありますが、nが完全な正方形の場合は特殊なケースがあります。この場合、平方根を2回カウントしたために1をサブする必要があります。 –