如何找到满足函数约束的三个输入值
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 个方程组:f
、k
、z
。
程序将这些值分配给一个全局数组
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
这足以找到所有未知数。
我应该提供正确的输入:(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 个方程组:f
、k
、z
。
程序将这些值分配给一个全局数组
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
这足以找到所有未知数。