如何检查整数是否是数组中元素的线性组合?

Y H*_*Y H 0 c arrays boolean nested-loops

如何检查整数是否可以表示为长度为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;
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*tal 5

我从第一年的离散数学课程记得n是的线性组合x,并y当且仅当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;
}
Run Code Online (Sandbox Code Playgroud)

  • 真好 这也可以与“ array [],值&lt;= 0”一起使用。可能有“ array [i],array [j] == 0”的问题。 (2认同)