You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算体积对应长宽高组合数时如何避免重复计数?

三维体积尺寸组合去重统计方案

问题核心

原代码的三层循环未限制三个边长的大小关系,导致同一种尺寸的不同排列被重复计数。要解决该问题只需保证遍历的边长满足 a ≤ b ≤ c 的规则,每个唯一组合只会被统计一次。

方案1:保留三层循环的低改动版本

仅调整内层循环起始值,逻辑和原代码差异最小,可快速实现去重:

#include <stdio.h>
#include <math.h>

int main(){
    int v, m = 0, k = 0;
    scanf("%d", &v); // a为长,b为宽,c为高,v为体积
    for(int a=1;a<=v;a++){
        // b从a开始,保证b≥a
        for(int b=a;b<=v;b++){
            // c从b开始,保证c≥b
            for(int c=b;c<=v;c++){
                m = a*b*c;
                if(m == v){
                    k = k + 1; //k为组合总数
                }
                // 乘积超过体积时直接跳出,减少无效计算
                if(m > v) break;
            }
        }
    }
    printf("组合总数为:%d", k);
    return 0;
}

方案2:优化性能的高效版本

通过数学计算移除第三层循环,体积较大时性能优势非常明显:

#include <stdio.h>
#include <math.h>

int main(){
    int v, k = 0;
    scanf("%d", &v);
    // a作为最小边,上限为三次根号v,减少无效遍历
    for(int a=1; a <= pow(v, 1.0/3); a++){
        if(v % a != 0) continue; // a不是体积因数时直接跳过
        int rem1 = v / a;
        // b作为中间边,至少等于a,上限为剩余值的平方根
        for(int b=a; b <= sqrt(rem1); b++){
            if(rem1 % b != 0) continue; // b不是剩余值因数时直接跳过
            int c = rem1 / b;
            // 满足c≥b则符合a≤b≤c的规则,计数+1
            if(c >= b){
                k++;
            }
        }
    }
    printf("组合总数为:%d", k);
    return 0;
}

内容的提问来源于stack exchange,提问作者RandomCodeEnjoyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:36:04