【发布时间】:2017-11-06 19:36:04
【问题描述】:
任务是编写一个程序,它读入一个整数 k,并打印出正整数的个数 介于 1 和 100000(含)之间,恰好有 k 个除数。例如,数字 24 有 8 个除数: 1、2、3、4、6、8、12 和 24。
我有一个正在运行的程序,但有没有我可以加快搜索速度??
#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),如果找到一个除数,则添加另一个除数,除非它相同(完美平方的情况)。
-
每当我执行循环直到 i 的平方根时,每次运行程序时它都会给我一个不正确且不同数量的除数
-
检查重复链接并接受您的问题是重复的。为了加快速度,您只需要循环直到 int(sqrt(n)) 包括在内,但是如果 n 是一个完美的平方,则有一种特殊情况,在这种情况下,您必须低于 1,因为您计算了平方根两次。
-
@Jean-FrançoisFabre - 链接到答案中的 cmets 包括从未纳入该答案的建议优化。我在下面发布的答案包括这些优化。
-
@Jean-FrançoisFabre - 我在我的答案中添加了第二个类似例子,这与链接到的答案有很大不同。
标签: c