Pour vérifier si un nombre décimal est divisible par 7:
Effacez le dernier chiffre. Multipliez-le par 2 et soustrayez de ce qui reste. Si le résultat est divisible par 7, le nombre d'origine est divisible par 7.
(également décrit par exemple ici )
Cette règle est bonne pour le contrôle manuel de divisibilité. Par exemple:
2016 est-il divisible par 7?
Soustrayez
6*2
de 201; nous obtenons 189. Est-ce divisible par 7? Pour le vérifier, appliquons à nouveau la règle.Soustrayez
9*2
de 18; nous obtenons 0. Par conséquent, 2016 est divisible par 7.
Dans ce défi, vous devez appliquer cette règle jusqu'à ce que le statut de divisibilité soit évident , c'est-à-dire que le nombre ne dépasse pas 70 (cependant, voir ci-dessous pour plus de détails). Créez une fonction ou un programme complet.
Entrée : un entier positif; votre code doit prendre en charge des entrées jusqu'à 32767 (la prise en charge d'entiers de précision arbitraire est un bonus; voir ci-dessous).
Sortie : un entier (éventuellement négatif), non supérieur à 70, résultant de l'application de la règle de divisibilité par 7 zéro ou plusieurs fois.
Cas de test:
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
Lorsque deux sorties possibles sont spécifiées, l'un ou l'autre résultat est correct: le second correspond à l'application de la règle une fois de plus. Il est interdit d'appliquer la règle sur un numéro à un chiffre: si vous effacez le chiffre, il ne reste plus rien (pas 0).
Bonus : si votre algorithme
- Prend en charge les entiers de précision arbitraire
- Effectue un seul passage sur l'entrée
- A une complexité spatiale
o(n)
(c.-à-d. Inférieure àO(n)
) et - A une complexité temporelle
O(n)
,
où n
est le nombre de chiffres décimaux:
Soustrayez 50% du nombre d'octets de votre code.
Véritable bonus :
De plus, si votre algorithme lit l'entrée dans la direction normale, en commençant par le chiffre le plus significatif, soustrayez à nouveau 50% - votre score est de 25% de votre nombre d'octets (cela semble possible, mais je ne suis pas absolument sûr).
1000000000000000000001
.
long long
s ou un type équivalent intégré?