Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 确定可分解为2^p5^q的数字集的算法_Algorithm_Math_Factorization - Fatal编程技术网

Algorithm 确定可分解为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的数字,不如

我正在尝试编写一个算法,它可以返回小于实例n的正整数集,并且可以分解为2^p5^q。我的数学不是最好的,所以我不知道如何确定一个数字是否可以用这种特定的形式分解


任何帮助都将不胜感激:)

使用两个队列:
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;