如何找到满足函数约束的三个输入值

how to Find the three input values that satisfy the constraints imposed by the functions

我应该提供正确的输入:(f,k,z) 让程序打印句子: 确切地!做得好。输入应满足3种方法 这里我们有 3 个方法,每个方法要么成功要么失败(如果失败则打印:nope) 我尝试手动执行 metallica 和 aerosmith 方法并求解方程但是卡在那里...

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
static int64_t ac_dc[] = {10143, 54893, 47109, 24350, 17669, 82062};
const static int N = sizeof(ac_dc) / sizeof(*ac_dc);
static void fail() {
    puts("Nope!");
    exit(EXIT_FAILURE);
}
static void linkin_park(int64_t t, int64_t v, int64_t s) {
    if(t - s / 7 + 3 * v / 11) fail();
}
static void metallica(int o, int64_t j) {
    int64_t g = j;
    for(; o < N; ++o) {
        if((o % 2) == 0) continue;
        g += ac_dc[o];
    }
    if(g != 94857) fail();
}
static void aerosmith(int d, int64_t n) {
    if(d < N) {
        if(d % 2)
            aerosmith(++d, n);
        else
            aerosmith(d + 1, n * ac_dc[d]);
    } else if(n != 540151794)
        fail();
}
int main() {
    int64_t f, k, z;
    printf("Please enter the right three numbers: ");
    fflush(stdout);
    if(scanf("%" SCNd64 " %" SCNd64 " %" SCNd64, &f, &k, &z) != 3) fail();
    ac_dc[0] = f;
    ac_dc[5] = k;
    ac_dc[4] = z;
    metallica(0, 14041);
    aerosmith(1, 9);
    linkin_park(f, k, z);
    puts("Exactly! Good job.");
}

将其视为具有 3 个未知数的 3 个方程组:fkz

程序将这些值分配给一个全局数组

static int64_t ac_dc[] = {f, 54893, 47109, 24350, z, k}; // conceptually

linkin_park 函数基本上是一个包含 3 个变量的方程:

f - z/7 + 3*k/11 = 0

我们将在最后使用它来找到最后一个未知数,给定其他两个。

metallica“更容易”:

g + ac_dc[1] + ac_dc[3] + ac_dc[5] = 94857
14041 + 54893 + 24350 + k = 94857
k = 1573

aerosmith 更具挑战性,但如果我们跟踪递归调用的参数:

d n n passed
1 9 9
2 9 9 * ac_dc[2] = 9 * 47,109 = 423,981
3 423,981 423,981
4 423,981 423,981 * z
z = 540151794 / 423981

这足以找到所有未知数。