2

数学广场: 像这个:http ://www.ps-heine.de/archives/416

  • 数学正方形必须从左到右,从上到下求解。
  • 操作规则的顺序不适用。
  • 每个号码只能按时使用。

我从小学就喜欢这本书,但不幸的是我找不到任何书。对此感到失望,我以为我可以尝试自己做一些。

我仍处于概念阶段,但让我解释一下我到目前为止所采取的步骤:

首先我创建一个数组$matrix

  • 它包含矩阵的每一行的数组。
  • 每个行数组包含实际行的列/单元格。
  • 每个单元格都是一个带有参数“id”、“type”和“value”的数组。

在此处查看阵列示例:http: //pastebin.com/RdBmxvjq

在此示例中,您已经可以看到运算符。

我有一个函数 operator(),它随机返回运算符“+”、“-”、“*”、“/”之一。

自然首先包括运算符,而不是找到适合矩阵的数字以及它们比反之亦然容易得多。

在这一点上,我可能已经完成了!

现在我可以输入随机数(当然是从数组中,所以它们不会重复),计算行和列的结果,删除数字并完成我的拼图!

如果没有除法运算符!

当然,我们不希望我/最终用户尝试除以素数或得到小数。

现在我可以循环并“蛮力”,直到我找到在除号之前输入的完美数字,但这是如此...... naff

我希望有一种方法可以在最初确保所有部门的结果都很好……结果……

有任何想法吗?

编辑:

让我添加一些我刚刚想到的一些随机想法,这些想法对我来说有点有意义:

首先,当我更改拼图中的数字时,它将对整个拼图生效。因此,更改数字,包括所有类型的蛮力,是性能杀手(除了它的 naff 之外)。

因此,一个合乎逻辑的结果是首先开始仅在发生除法的地方包含数字。

我们可以使用一个数字作为我们首先通过乘以其他一些数字来计算的“产品”,以确保该数字不是质数并具有一个因子。

但是,如果其中一个因数是质数,又发生了除法,会发生什么?

如果我们反复使用一个数字乘以另一个数字来获得一个非质因数,这将减少我们拼图中数字的多样性,从而使整个事情变得不那么有趣。

当我们对它进行“逆向工程”时,谜题中的乘法会发生什么?他们自动“成为分裂”,问题重新开始。

请让一些数学家来叫我愚蠢并提出一个非常简单的解决方案......

4

1 回答 1

3

尝试这个:

$num = integer; // the number before /
$factors = array(1, $num); // allowed numbers after / (1 and $num are always allowed)

// loop through whole numbers up to the original $num
for($i = 2; $i < $num ; $i++) {
    // if $i can devide $num, save it and the other factor
    if($num % $i == 0) {

        // if $i is there, we have gone through all factors, no need to loop anymore
        if(in_array($i, $factors)) {
            break;
        }

        // save $i and $num / $i
        $factors[] = $i;
        if($i != $num / $i) { // do not save $i twice
            $factors[] = $num / $i;
        } 
    }
}

并使用 $factors 数组中的随机数作为“/”之后的数字。

关于填写数字(伪代码):

R = row, C = collumn
for(R; R < max rows; R = R+2) { // R+2 to skip sign rows
    for(C; C < max cols; C = C+2) { // C+2 to skip sign columns

        if(C-1 == / && R-1 == / && C >= 2 && R >= 2) {
            find factors of C - 2;
            find factors of R - 2;
            select number from subsection of these (should be at least 1)                 
        } 

        else if (C-1 == / && C >= 2) {
            select number from factors of C-2
        }

        else if (R-1 == / && R >= 2) {
            select number from factors of R-2
        }   

        else {
            select any number (maybe select just non-prime numbers here)
        }
    }
}

我不想承认,这就是我今天的所有脑力......我稍后会检查一下,看看是否有任何有趣的发展。

于 2012-08-30T15:22:27.573 回答