我已经解决了这个问题(参见下面的代码),但是我没有一个令人满意的名称来命名结果function.Also,我想更广泛地探讨这个问题,但我不知道我在搜索什么。我试过“循环数学”,“时钟问题”,我甚至记得单子被用来解决这个原则,但我找不到我在哪里看到的。
问题:给定一组连续的数字,这些数字像时钟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;
发布于 2019-01-06 04:51:35
感谢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;
https://stackoverflow.com/questions/54049738
复制相似问题