📅  最后修改于: 2023-12-03 14:57:28.741000             🧑  作者: Mango
有一个正整数,将其每一位数字旋转后可以得到许多新的数字,例如 123 可以得到 123、231、312。现在要求计算出其中旋转后可被 8 整除的数字的总数。
考虑到旋转后的数字是可能很大的,我们可以将其转换为字符串,并进行多次旋转。对于每一次旋转,将字符串分成两段并交换后再拼接起来即可。需要注意的是,如果字符串以 0 开头,则不能将其旋转为以非零数字为开头的数字,因此需要特判。
计算可被 8 整除的数字可以通过判断其最后三位数是否可以被 8 整除来实现。
/**
* 计算可被 8 整除的旋转次数
* @param int $n 正整数
* @return int
*/
function countRotations(int $n): int
{
$str = (string)$n;
$count = 0;
// 对每一位数字进行旋转
for ($i = 0; $i < strlen($str); $i++) {
// 如果数字以 0 开头,则不能旋转为以非零数字开头的数字
if ($str[$i] == '0') {
continue;
}
// 将数字进行旋转并判断是否可被 8 整除
$temp = $str;
for ($j = 0; $j < strlen($str); $j++) {
$newStr = substr($temp, $i) . substr($temp, 0, $i);
if (substr($newStr, -3) % 8 == 0) {
$count++;
}
$temp = $newStr;
}
}
return $count;
}
echo countRotations(123); // 输出 3
echo countRotations(1024); // 输出 4
echo countRotations(8); // 输出 1
以上示例分别测试了数字 123、1024 和 8,结果分别为 3、4 和 1,符合预期。