我已经解决了这个问题(请参见下面的代码),但是对于结果函数我没有一个令人满意的名字。此外,我想更广泛地探讨这个问题,但我不知道我在寻找什么。我曾经尝试过“循环数学”,“时钟问题”,甚至还记得用monad来解决这个原理,但是我找不到我看到的地方。
问题:给定一组连续的数字,它们像时钟1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4..
一样绕圆(在我的情况下为色阶),并给定距离(以整数表示),我想计算结果数在那个圆形系列上。
因此,如果时钟显示5,而我增加9个小时,则结果应为2。
5+9=2
或3-7=8
问题是我怎么称呼它。这是PHP中的解决方案:
function circularmath($strExpression = "2+2" , $top = 355 ){
$result = 0;
if(preg_match('/^\d+[+-]\d+$/',$strExpression)){
list($n1,$op,$n2)=preg_split('/([+-])/',$strExpression, null, PREG_SPLIT_DELIM_CAPTURE);
$result =($op==="+")? $n1+$n2:$n1-$n2;
if($result < 0){
$result=$top+$result;
}elseif($result > $top){
$result=$result-$top;
}
}
return $result;
}
$foo = circularmath("352+4");
echo $foo;
答案 0 :(得分:0)
感谢Thomas G和ggorlen。实际上,它是模块化算术,它可以产生更好的代码:
function mod($a, $n) {
return ($a % $n) + ($a < 0 ? $n : 0);
}
function circularmath($strExpression = "2+2" , $top = 355 ){
$result = null;
if(preg_match('/^\d+[+-]\d+$/',$strExpression)){
list($n1,$op,$n2)=preg_split('/([+-])/',$strExpression, null, PREG_SPLIT_DELIM_CAPTURE);
$result =($op==="+")? $n1+$n2:$n1-$n2;
$result = mod($result , $top) ;
}
return $result;
}
$foo = circularmath("352+4")."\n";
echo "f:".$foo;