[英]Finding the number of divisors?
我编写此代码是为了找到给定数字的除数的数量。 我试图实现的方法找到所有素数因子(有效)并获取相似素数的数量加一(给出除数的数量)。
例如28 = 2 * 2 * 7 - >(2 + 1)*(1 + 1)= 6
这是我的尝试:
int num = 20;
int next = 0;
int exponent = 0;
int numberOfDivisors = 1;
start:
for (int i = 2; i <= num; i++)
{
next = i;
if (num%i == 0)
{
if (i == next)
{
exponent++;
}
else
{
numberOfDivisors *= (exponent+1);
exponent = 0;
}
if (num != i)
{
num /= i;
goto start;
}
}
}
std::cout << numberOfDivisors << std::endl;
我只是无法弄清楚我错过了什么。
从评论中可以看出,使用goto很糟糕。 经过一些清理后,您的代码归结为:
#include <iostream>
int main() {
int num = 20;
int numberOfDivisors = 1;
for (int i = 2; i <= num; i++)
{
int exponent = 0;
while (num % i == 0) {
exponent++;
num /= i;
}
numberOfDivisors *= (exponent+1);
}
std::cout << numberOfDivisors << std::endl;
return 0;
}
实际上, goto
没有帮助,因为你已经检查了较低的素因子,所以不需要把i
放回到2
。
int numberOfDivisors = 1;
int exponent = 1;
int i = 2;
while (i <= num) {
if (num%i == 0) {
exponent++;
num /= i;
}
else {
numberOfDivisors *= exponent;
exponent = 1;
i++;
}
}
numberOfDivisors *= exponent; // <-- you were missing this, mainly
您的代码与样式或性能无关的实际问题是您的循环完成了一些您从未包含的exponent
。
你的代码有很多问题(并且goto
打断循环只是丑陋),但你的代码的一个主要问题是,在你进入for
循环之后,你设置next
与i
具有相同的值。
然后,你测试一些东西(即,如果i
平均分配num
,但这没关系) 和 (这里是关键部分,你测试i
是否等于next
,你只需将它们设置为相等。
因此,您的代码永远不会有机会输入相应if
的else
部分,这是您将除数的数量乘以exponent + 1
。
因此,您的代码始终打印1
,这不是您想要的。
PS:作为死代码消除的一部分,编译器可以完全优化其他内容,如果我启用优化-O1
或更高版本,这就是我的gcc 4.7实际执行的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.