Existe-t-il un moyen de convertir une chaîne en entiers sans utiliser la multiplication. L'implémentation de int.Parse () utilise également la multiplication. J'ai d'autres questions similaires où vous pouvez convertir manuellement une chaîne en int, mais cela nécessite également de multiplier le nombre par sa base 10. C'était une question d'interview que j'avais dans l'une des interviews et je n'arrive pas à trouver de réponse à ce sujet.
9
x<<1 + x<<3
), mais c'est toujours une façon d'utiliser la multiplication, donc il est difficile de dire si c'est "dans l'esprit" de la question ...for (int i = 0; i < 10; i++) result += number;
compte?Réponses:
Si vous supposez un système numérique en base 10 et que vous remplacez la multiplication par des décalages de bits ( voir ici ), cela peut être une solution pour les entiers positifs .
Voir l'exemple sur ideone .
La seule hypothèse est que les personnages
'0'
se'9'
trouvent directement les uns à côté des autres dans le jeu de caractères. Les caractères numériques sont convertis en leur valeur entière à l'aide decharacter - '0'
.Éditer:
Pour les entiers négatifs, cette version ( voir ici ) fonctionne.
En général, vous devez prendre en compte les erreurs comme les vérifications nulles, les problèmes avec d'autres caractères non numériques, etc.
la source
Ça dépend. Parlons-nous de l'opération logique de la multiplication, ou comment cela se fait-il réellement dans le matériel?
Par exemple, vous pouvez convertir une chaîne hexadécimale (ou octale, ou tout autre multiplicateur de base deux) en un entier "sans multiplication". Vous pouvez parcourir caractère par caractère et conserver oring (
|
) et bitshifting (<<
). Cela évite d'utiliser l'*
opérateur.Faire de même avec des chaînes décimales est plus délicat, mais nous avons encore un ajout simple. Vous pouvez utiliser des boucles avec ajout pour faire la même chose. Assez simple à faire. Ou vous pouvez créer votre propre "table de multiplication" - j'espère que vous avez appris à multiplier les nombres à l'école; vous pouvez faire la même chose avec un ordinateur. Et bien sûr, si vous êtes sur un ordinateur décimal (plutôt que binaire), vous pouvez faire le "décalage de bits", tout comme avec la chaîne hexadécimale précédente. Même avec un ordinateur binaire, vous pouvez utiliser une série de décalages de bits -
(a << 1) + (a << 3)
c'est la même chose quea * 2 + a * 8 == a * 10
. Attention aux nombres négatifs. Vous pouvez trouver de nombreuses astuces pour rendre cela intéressant.Bien sûr, les deux ne sont que des multiplications déguisées. En effet, les systèmes numériques de position sont intrinsèquement multiplicatifs . Voilà comment fonctionne cette représentation numérique particulière. Vous pouvez avoir des simplifications qui cachent ce fait (par exemple, les nombres binaires n'ont besoin
0
que1
, et donc au lieu de multiplier, vous pouvez avoir une condition simple - bien sûr, ce que vous faites vraiment est toujours la multiplication, juste avec seulement deux entrées possibles et deux possibles sorties), mais il est toujours là, tapi.<<
est identique à* 2
, même si le matériel qui effectue l'opération peut être plus simple et / ou plus rapide.Pour supprimer complètement la multiplication, vous devez éviter d'utiliser un système positionnel. Par exemple, les chiffres romains sont additives (notez que les chiffres romains réels ne pas utiliser les règles de compactification que nous avons aujourd'hui - quatre serait
IIII
pasIV
, et quatorze ont pu être écrites sous une forme quelconque commeXIIII
,IIIIX
,IIXII
,VVIIII
etc.). Convertir une telle chaîne en entier devient très facile - il suffit de passer caractère par caractère et de continuer à ajouter. Si le personnage estX
, ajoutez-en dix. SiV
, ajoutez cinq. SiI
, ajoute un. J'espère que vous pouvez voir pourquoi les chiffres romains sont restés si populaires pendant si longtemps; les systèmes numériques de position sont merveilleux lorsque vous devez faire beaucoup de multiplication et de division. Si vous avez principalement affaire à l'addition et à la soustraction, les chiffres romains fonctionnent très bien et nécessitent beaucoup moins de scolarité (et un boulier est beaucoup plus facile à fabriquer et à utiliser qu'une calculatrice de position!).Avec des missions comme celle-ci, il y a beaucoup de aléas sur ce que l'intervieweur attend réellement. Peut-être qu'ils veulent juste voir vos processus de pensée. Adoptez-vous des détails techniques (ce
<<
n'est pas vraiment de la multiplication)? Connaissez-vous la théorie des nombres et l'informatique? Plongez-vous simplement dans votre code ou demandez-vous des éclaircissements? Le voyez-vous comme un défi amusant ou comme une autre question d'entrevue ennuyeuse et ridicule qui n'a aucune pertinence par rapport à votre travail? Il nous est impossible de vous dire la réponse que l'intervieweur cherchait.Mais j'espère qu'au moins je vous ai donné un aperçu des réponses possibles :)
la source
Considérant qu'il s'agit d'une question d'entrevue, la performance peut ne pas être une priorité élevée. Pourquoi pas seulement:
Si la chaîne transmise n'est pas un entier, la méthode lèvera une exception de débordement.
la source
public int StringToInt(string value, int search_from = int.MinValue) => value == search_from.ToString() ? search_from : StringToInt (value, ++search_from);
Enumerable.Range(int.MinValue, int.MaxValue).First(i => i.ToString() == stringValue
.Toute multiplication peut être remplacée par des ajouts répétés. Vous pouvez donc remplacer n'importe quelle multiplication dans un algorithme existant par une version qui utilise uniquement l'addition:
Vous pouvez aller plus loin et écrire une chaîne spécialisée dans Int en utilisant cette idée qui minimise le nombre d'ajouts (nombre négatif et gestion des erreurs omis pour plus de brièveté):
Mais je ne pense pas que cela en vaille la peine car les performances ne semblent pas être un problème ici.
la source