Algorithm 求给定体积的所有大小的长方体

Algorithm 求给定体积的所有大小的长方体,algorithm,Algorithm,我有一个整数区间,我需要找到所有唯一的长方体,它们的体积都在这个区间内 我提出了一个循环,它将3个数字(长方体大小)(1x1x1,1x1x2,…;2x1x1被认为与1x1x2相同)的所有uniqe组合从1循环到区间的上限,然后检查计算的体积是否在区间内。如果上限范围不太大,此解决方案将非常有效。但是,如果间隔以千为单位结束,那么解决方案就会变得非常缓慢 我对代码并不感兴趣,因为我对如何以不同方式解决这个问题的算法感兴趣。如何解决这个问题?定义目标间隔I=[A…B],给你M=B-A+1个不同的整数

我有一个整数区间,我需要找到所有唯一的长方体,它们的体积都在这个区间内

我提出了一个循环,它将3个数字(长方体大小)(1x1x1,1x1x2,…;2x1x1被认为与1x1x2相同)的所有uniqe组合从1循环到区间的上限,然后检查计算的体积是否在区间内。如果上限范围不太大,此解决方案将非常有效。但是,如果间隔以千为单位结束,那么解决方案就会变得非常缓慢


我对代码并不感兴趣,因为我对如何以不同方式解决这个问题的算法感兴趣。如何解决这个问题?

定义目标间隔I=[A…B],给你M=B-A+1个不同的整数体积

你必须孤立地考虑这些问题。

对于这些目标卷v中的任何一个,一个简单的算法(可能比您的算法更好)是:

  • 求它的素数分解;让它产生Ω(n)因子;将它们存储为列表a。
  • {v,1,1}是可能的元组
  • 对于1…Ω(n)中的i:
    3.1. r=prod(l=1到i的A_l)
    3.2{r,v/r,1}是可能的元组
    3.3对于i+1中的k…Ω(n):
    3.3.1 s=prod(m=i+1至k的A_m) 3.3.2{r,s,v/r/s}是可能的元组

  • 这个算法很幼稚,因为它假设找到一个目标很容易。事实上,在创建一个数组时,您最好已经记下所有元组。

    如果您的代码速度慢,它可能正在尝试可以立即丢弃的值范围,或者它过于复杂,并在循环条件中计算平方根或立方根等等。尝试下面的代码示例这样的简单方法,确保≤ B≤ c为避免重复:

    if(Math.cbrt==undefined)//旧浏览器的立方根修复
    
    Math.cbrt=function(x){var n=1;while(n*n*n我可能会对前两个维度的对进行循环,然后直接计算第三个维度的最小值和最大值以得到区间,并根据前两个维度的乘积保存早期解。类似于:

    volume_interval = (Vmin, Vmax)
    solution_intervals = {}
    for w = 1 to n do
        for d = w to n do
            // see whether we've already encountered this case before
            if solution_intervals[w*d] is not defined then
                // compute min and max height to get in volume interval
                min = ceiling(volume_interval.Vmin / (w*d))
                max = floor(volume_interval.Vmax / (w*d))
                solution_intervals[w*d] = (min, max)
            // look up precomputed solution
            soln = solution_intervals[w*d]
            // print out every possible set of dimensions
            for i = soln.min to soln.max do
                print w, d, h
    

    在这个上下文中,什么是长方体?一个可以计算体积V=abc的对象…**在这个上下文中**?意思是:对构造这个长方体的数字有什么限制?对不起,长方体边是整数,例如3x2x2x2,2x2x2,1xx3边是整数,没有其他限制,如果给定体积为15的长方体h面15x1x1是有效的谢谢。但我不能真正使用这个解决方案。我担心这个解决方案在C中实现会非常痛苦。不幸的是,我在我可以使用的方面非常有限。包括内存和计算时间。嗯?不,这将是非常直接的在C中实现(实现:您在问题中明确表示不关心)@Sopel最小音量和最大音量之间有一个范围,因此任何a和b都可能有多个c。