// Check if a string contains only '0' and '1'
function isBinary(string $s): bool {
return preg_match('/^[01]+$/', $s) === 1;
}
/*
In decimal: reading "123" means
remainder = remainder * 10 + digit
In binary: reading "1011" means
remainder = remainder * 2 + bit
*/
/*
0 (0*2 + 0) % 7 0
0 (0*2 + 0) % 7 0
0 (0*2 + 0) % 7 0
1 (0*2 + 1) % 7 1
1 (1*2 + 1) % 7 3
1 (3*2 + 1) % 7 0
0 (0*2 + 0) % 7 0
0 (0*2 + 0) % 7 0
*/
// Compute binary string modulo 7 without overflow
function divisibleBy7(string $s): bool {
$remainder = 0;
for ($i = 0; $i < strlen($s); $i++) {
$c = $s[$i];
$remainder = ($remainder * 2 + (ord($c) - ord('0'))) % 7;
}
return $remainder === 0;
}
$s = "00011100"; // 28
if (!isBinary($s)) {
echo "Not a binary string\n";
exit;
}
if (divisibleBy7($s)) {
echo "Divisible by 7\n";
} else {
echo "Not divisible by 7\n";
}
/*
run:
Divisible by 7
*/