Para verificar si un número decimal es divisible por 7:
Borra el último dígito. Multiplique por 2 y reste de lo que queda. Si el resultado es divisible por 7, el número original es divisible por 7.
(también descrito, por ejemplo, aquí )
Esta regla es buena para la verificación manual de divisibilidad. Por ejemplo:
¿Es 2016 divisible por 7?
Restar
6*2
de 201; obtenemos 189. ¿Es esto divisible por 7? Para verificarlo, apliquemos la regla nuevamente.Restar
9*2
de 18; obtenemos 0. Por lo tanto, 2016 es divisible por 7.
En este desafío, debe aplicar esta regla hasta que el estado de divisibilidad sea obvio , es decir, el número no sea mayor que 70 (sin embargo, consulte los detalles a continuación). Hacer una función o un programa completo.
Entrada : un entero positivo; su código debe admitir entradas de hasta 32767 (la compatibilidad con enteros de precisión arbitraria es una ventaja; consulte a continuación).
Salida : un número entero (posiblemente negativo), no mayor que 70, que es el resultado de aplicar la regla de divisibilidad por 7 cero o más veces.
Casos de prueba:
Input Output Alternative output
1 1
10 10 1
100 10 1
13 13 -5
42 42 0
2016 0
9 9
99 -9
9999 -3
12345 3
32767 28 -14
---------- Values below are only relevant for the bonus
700168844221 70 7
36893488147419103232 32 -1
231584178474632390847141970017375815706539969331281128078915168015826259279872 8
Cuando se especifican dos salidas posibles, cualquiera de los resultados es correcto: el segundo corresponde a aplicar la regla una vez más. Está prohibido aplicar la regla en un número de un solo dígito: si borra el dígito, no queda nada (no 0).
Bonificación : si tu algoritmo
- Admite enteros de precisión arbitraria
- Realiza solo una pasada en la entrada
- Tiene complejidad espacial
o(n)
(es decir, menor queO(n)
); y - Tiene complejidad de tiempo
O(n)
,
donde n
es el número de dígitos decimales:
Resta el 50% del recuento de bytes de tu código.
Bonificación real :
Además, si su algoritmo lee la entrada en la dirección normal, comenzando desde el dígito más significativo, reste 50% una vez más; su puntaje es el 25% de su conteo de bytes (parece posible, pero no estoy absolutamente seguro).
1000000000000000000001
.
long long
s o algún tipo equivalente incorporado?