【问题标题】:How to prevent duplicate numbers when trying to find combinations for something?尝试查找某物的组合时如何防止重复数字?
【发布时间】:2021-11-20 18:56:19
【问题描述】:

我正在尝试制作一个程序来计算对象体积的长度、高度和宽度的所有多种组合。

我创建了一些循环遍历所有可能的组合,但我不知道如何防止出现倍数?例如,如果已经找到 1x1x2,我不想计算 1x2x1。到目前为止,这是我的代码:

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

int main(){
    int v, m = 0, k = 0;
    scanf("%d", &v); // a is length b is width c is height and v is volume
    for(int a=1;a<=v;a++){
        for(int b=1;b<v;b++){
            for(int c=1;c<v;c++){
                m = a*b*c;
                if(m == v){
                    k = k + 1; //k is the number of combinations
                }
            }
        }
    }
    printf("The number of combinations was: %d", k);
    return 0;
}

【问题讨论】:

  • 你也说“它应该找到所有组合”,但不是找到它们,你只是计算它们。那么,您需要找到计数,还是需要生成一个包含所有计数的集合?
  • @MarcusMüller 如果您的代码明显是 C 但它是无效的 C 并且巧合的是它恰好是有效的 C++,那么它不是 C。它是 C++。你在抱怨命名空间,但我很少看到人们使用std:: 来表示scanfprintf,即使在明显是C++ 的代码中也是如此。这里的代码是一个有效的 C++,它被明确地标记为 C++,所以克服它,把它当作 C++ 对待。如果你愿意,你可以提供一些关于如何让它变得更好的建议。
  • 请注意,int main() 不是严格有效的 C(应该是 int main(void)) - 但它是完全有效的 C++。
  • @NO_NAME 我真的只是想让 RandomCodeEnjoyer 得到对他们有帮助的答案;当人们不止一次地实际寻找 C 解决方案时,我已经看到人们将事物标记为 C++;你能不干扰他们充分利用我的回答吗?谢谢。
  • 只是因为这个讨论已经失控了:这里的核心问题是 RandomCodeEnjoyer 是否需要计数(在这种情况下根本不需要循环,这只是组合)还是元组的实际容器.如果他们需要一个容器,那么如果这是为了与 C 代码(或者实际上是 C 代码)交互,那么 C++ 的答案对他们没有帮助,这就是我礼貌地问的原因。

标签: c loops


【解决方案1】:

您刚刚在评论中说您不想真正经历所有这些组合;你只想要他们的计数。

这更容易,因为它是基本的组合:这只是 k-组合与重复的次数;这样的组合的个数就是multiset coefficient,可以用一个二项式系数来表示,计算方便,由

这里,n 是可供选择的元素数量(在你的情况下是 v!),k 是你选择的数量,所以是 3。

所以,您需要做的就是编写一个 C 函数,它接受两个数字 n 和 k,并计算 (n+k-1+k)! / (n!·(n+k-1-k)!)。我相信你可以写一个教师函数。

【讨论】:

  • 读了几遍后,我明白你的建议了,但是这个答案可以使用代码 sn-p 并且可能是输出的示例。
  • @NO_NAME 确实。 特别是,因为在 OP 的三个循环条件中,&lt;&lt;= 比较之间存在混淆。
  • @NO_NAME 很乐意提供,但你会注意到 OP 的代码比 C++ 更多,所以我问他们希望用哪种语言回答,但我没有收到回复还没!
  • 我不关注。 OP的代码绝对是C++。它甚至不会编译为 C。此外,问题标记为 C++。现在代码可能不是 C++,但这不是特别相关。
  • @AdrianMole a 有
【解决方案2】:

注意这个问题基本上是一个整数的因式分解,这样可以节省很多迭代:

int combinations(int volume)
{
    int k = 0;
    for ( int a = 1; a <= volume / a; ++a )
    { //             ^^^^^^^^^^^^^^^ Up to the square root of volume
        if ( volume % a == 0 )
        { // ^^^^^^^^^^^^^^^   Consider only the factors
            const int area = volume / a;
            for( int b = a; b <= area / b; ++b )
            {
                if ( area % b == 0 )
                {
                    const int length = area / b;               
                    printf("%d = %d * %d * %d\n", a * b * length, a, b, length);
                    ++k;
                }
            }
        }
    }
    return k;
}

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2020-01-24
    • 2015-07-07
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多