Algorithm 确定可分解为2^p5^q的数字集的算法
我正在尝试编写一个算法,它可以返回小于实例n的正整数集,并且可以分解为2^p5^q。我的数学不是最好的,所以我不知道如何确定一个数字是否可以用这种特定的形式分解Algorithm 确定可分解为2^p5^q的数字集的算法,algorithm,math,factorization,Algorithm,Math,Factorization,我正在尝试编写一个算法,它可以返回小于实例n的正整数集,并且可以分解为2^p5^q。我的数学不是最好的,所以我不知道如何确定一个数字是否可以用这种特定的形式分解 任何帮助都将不胜感激:)使用两个队列:q1、q2 从第一季度开始,第二季度开始为空 (在下文中,定义q.head()==1如果q为空,则仅在第一次迭代中才需要它) 在`min{q1.head(),q2.head()}时重复 我不知道如何才能确定一个数字是否可以按这种特定形式分解 与其测试给定的数字是否可以分解并遍历所有小于n的数字,不如
任何帮助都将不胜感激:)使用两个队列:
q1、q2
从第一季度开始,第二季度开始为空
(在下文中,定义q.head()==1
如果q
为空,则仅在第一次迭代中才需要它)
在`min{q1.head(),q2.head()}时重复
我不知道如何才能确定一个数字是否可以按这种特定形式分解
与其测试给定的数字是否可以分解并遍历所有小于n的数字,不如直接生成它们,例如:
void findNumbers(int n)
{
int p = 0;
int power2 = 1;
while(power2 < n)
{
int q = 0;
int power5 = 1;
while(power5 * power2 < n)
{
printf("%d p = %d q = %d\n", power5 * power2, p, q);
power5 *= 5;
q++;
}
power2 *= 2;
p++;
}
}
它只是循环通过p和q的每一个组合,直到n
如果要排除p=0和q=0,只需在1处启动循环,并设置power2=2和power5=5。可能需要比“生成所有数字,然后测试它们是否为2^p 5^q
”更好的算法。但是为了回答您关于如何确定正数是否为2^p5^q
形式的问题,您将所有可能的2
s和5
s分开。如果还剩下什么,则原始数字没有该因式分解:
while ( n % 5 == 0 ) {
n /= 5;
}
while ( n % 2 == 0 ) {
n /= 2;
}
return n==1;
有很多方法可以测试一个数字是否2^p
,但我发现它们的可读性不如最后四行。避免测试一个数字是否小于限制更安全。这里的乘法运算可能会溢出。最好将限制除以5和2,并将数字与减少的限制进行比较。@Potatoswatter这是一个很好的观点,值得作为实现细节加以考虑,但让我们假设上面只是解释算法的伪代码,即使它看起来确实可疑地像可编译的C代码:)@NiklasB。你不需要@Mark是的,实际上应该是(a*b5
时,你添加了2*5和5*5。@potatosatter我特别定义了x
,出于这个原因,你认为它仍然不清楚吗?我会尝试进一步澄清一下。谢谢你的反馈。如果5和2属于这个集合,那么1也可以,您应该从x=1和空队列开始。@NiklasB。(1)它正在生成已排序的队列,如果需要可以节省一些额外的时间。(2)很容易生成集合中的k
th元素(只需在k个元素之后停止)。
1 p = 0 q = 0
5 p = 0 q = 1
25 p = 0 q = 2
125 p = 0 q = 3
2 p = 1 q = 0
10 p = 1 q = 1
50 p = 1 q = 2
250 p = 1 q = 3
4 p = 2 q = 0
20 p = 2 q = 1
100 p = 2 q = 2
8 p = 3 q = 0
40 p = 3 q = 1
200 p = 3 q = 2
16 p = 4 q = 0
80 p = 4 q = 1
400 p = 4 q = 2
32 p = 5 q = 0
160 p = 5 q = 1
64 p = 6 q = 0
320 p = 6 q = 1
128 p = 7 q = 0
256 p = 8 q = 0
while ( n % 5 == 0 ) {
n /= 5;
}
while ( n % 2 == 0 ) {
n /= 2;
}
return n==1;