【问题标题】:How to check if an integer is linear combination of elements in an array?如何检查整数是否是数组中元素的线性组合?
【发布时间】:2018-05-15 00:00:25
【问题描述】:

如何检查一个整数是否可以表示为长度为 n 的给定数组中元素的线性组合?目前我可以针对 n=2 时的具体情况进行编码,但我不知道当 n 未知时如何编码。

这是n=2时的函数(当数组中只有两个元素时):

bool check(int array[], int n, int value){//n values in the array //    

  for (int i=1; i<array[0]; i++){
     for (int j=1; j<array[1]; j++){
        if ((i*array[0]+j*array[1])%value==0){
            printf("x=%d, y=%d, i=%d, j=%d\n", array[0], array[1], i, j);
            return 1;
        }
    }
    }
return 0;
}

【问题讨论】:

  • 所以...我想系数只能是整数,否则就没有意义了。
  • @DavidBowling 这就是我的意思,是的。
  • 是的,系数都是整数。@EugeneSh @ David Bowling
  • 使用递归处理任意长度的数组。
  • @Barmar 你能在这里指定如何使用递归吗?我对递归不是很有经验。谢谢!

标签: c arrays boolean nested-loops


【解决方案1】:

我记得在我第一年的离散数学课程中nxy 的线性组合当且仅当n 是gcd(x,y) 的倍数(即如果value % gcd(x,y) == 0

您可以将此概念用作代码中的强大资产。

这里的寓意是计算集合中所有元素之间的 gcd 并继续检查 value 是否可以被 gcd(x,y) 整除。如果是,则返回1,否则返回0

我将把 gcd() 函数的实现留给你(网上有很多例子),但是你可以将它合并到你现有的代码中:

bool check(int array[], int n, int value){
    for (int i = 0; i < n - 1; i++) {            // notice we only iterate up to n - 1
        for (int j = i + 1; j < n; j++) {
            if (value % gcd(array[i], array[j]) == 0) {
               printf("x=%d, y=%d, i=%d, j=%d\n", array[0], array[1], i, j);
               return 1;
            }
        }  
    }
    return 0;
}

【讨论】:

  • 不错。这也适用于array[], value &lt;= 0array[i], array[j] == 0 可能有问题。
  • 这个算法会产生假阴性,例如以防n=7array=[6, 15, 10]。您应该计算整个数组的 gcd,而不是成对的 gcd
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多