我有一個函式質因數分解,但它的作業很奇怪,我不知道如何使它正確。如果 2's 或 3's 是重復因子,則預計通過 'x' 列印因子并寫成 2^(power) 或 3^(power)。
我的輸出:2 >> 22^2 | 6 >> 2 x 3^2 | 8 >> 22^22^3 | 9 >> 3 x 3^2。
如何更改此代碼以使其正常作業。
注意:我在 main() 中說過如果 num == 1: 列印 1。
void prime_factors(int num)
{
int power = 0;
for (int factor = 2; num > 1; factor)
{
while (num % factor == 0)
{
if (factor >= 3 && power >= 1)
printf(" x %d", factor);
else
printf("%d", factor);
num /= factor;
power;
if (power >= 1)
{
printf("^%d", power);
}
}
}
}
uj5u.com熱心網友回復:
有四個問題:
power不會為每個因素重置為 0factor即使power是 0也在列印。- 它不應該列印
factor和power直到power完全確定。(目前,每次power遞增時都會列印代碼。 x如果第一個因子 > 2,則在開頭列印。
固定版本如下:
void prime_factors(int num)
{
int power = 0;
int first = 1;
for (int factor = 2; num > 1; factor)
{
power = 0;
while (num % factor == 0)
{
num /= factor;
power;
}
if (power >= 1)
{
if (first)
printf("%d", factor);
else
printf(" x %d", factor);
printf("^%d", power);
first = 0;
}
}
}
有多種方法可以加快速度。
加快速度的一種方法是在因子變得太大時跳過因子(大于 的平方根num,正如@chux在評論中所建議的那樣),num作為唯一剩余的因子。可以使用簡單的除法而不是計算平方根,如// speed up 1下面的代碼部分所示:
void prime_factors(int num)
{
int power = 0;
int first = 1;
for (int factor = 2; num > 1; factor)
{
power = 0;
// speed up 1
if (num / factor < factor)
{
// skip impossible factors
factor = num;
}
// end of speed up 1
while (num % factor == 0)
{
num /= factor;
power;
}
if (power >= 1)
{
if (first)
printf("%d", factor);
else
printf(" x %d", factor);
printf("^%d", power);
first = 0;
}
}
}
另一種加快速度的方法是factor在for大多數情況下在回圈中遞增2 ,除非factor是 2,因此序列將是 2、3、5、7、9、11 等:
for (int factor = 2; num > 1; factor = 1 (factor & 1))
該factor = 1 (factor & 1)增量factor1時factor為偶數時,和增量factor2時factor為奇數時,這樣的只有偶數值factor將是初始值2。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/342964.html
