2014-07-04 29 views
6

Próbuję implementować funkcje add2strings, sub2strings, mult2strings w języku Python. Wszystkie są bardzo proste, jeśli po prostu robisz int(string), ale chcę je wykonywać bez tego i bez importowania kolejnych oszukujących rzeczy, takich jak Decimal. Mój obecny pomysł to użycie bytes.Konwertuj ciąg na Int bez int()

Czy jest inny sposób na zrobienie tego?

+4

Jestem * bardzo * ciekawy wiedzieć, dlaczego chcesz to zrobić. –

+2

Można podzielić ciąg znaków, aby uzyskać znaki, a następnie porównać char z '" 0 "', aby uzyskać cyfrę '0', itp. – furas

+0

Praktyka kodowania. A ja lubię Pythona o wiele bardziej niż ATM C/C++. –

Odpowiedz

9

Patrz podstawowego atoi w C:

int myAtoi(char *str) 
{ 
    int res = 0; // Initialize result 

    // Iterate through all characters of input string and update result 
    for (int i = 0; str[i] != '\0'; ++i) 
     res = res*10 + str[i] - '0'; 

    // return result. 
    return res; 
} 

co przekłada się na Pythonie:

def atoi(s): 
    rtr=0 
    for c in s: 
     rtr=rtr*10 + ord(c) - ord('0') 

    return rtr 

go przetestować:

>>> atoi('123456789') 
123456789 

Jeśli chcesz wstawić opcjonalny znak i białe znaki tak, jak to robią: int:

def atoi(s): 
    rtr, sign=0, 1 
    s=s.strip() 
    if s[0] in '+-': 
     sc, s=s[0], s[1:] 
     if sc=='-': 
      sign=-1 

    for c in s: 
     rtr=rtr*10 + ord(c) - ord('0') 

    return sign*rtr 

Teraz dodaj wyjątki i już tam jesteś!

+0

Przyjemne porównanie :) – furas

+0

Przyjemny pomysł, nie zdawałem sobie sprawy, że mogę uogólnić problemy przez zrobienie atoi, robienie arytmetyki, a następnie używanie itoa. Myślałem o sprzęcie i planowaniu wykorzystania bitów transportowych. –

+0

Oczywiście trzeba zmodyfikować, aby obsługiwać białe spacje i opcjonalnie + lub - i początek ciągu, ale oba są trywialne. – dawg

2

Jest to bardzo nieefektywne, ale:

>>> zero = ord("0") 
>>> s = "1234" 
>>> sum([x * 10**i for i, x in enumerate(map(lambda x: x - zero, map(ord, s))[::-1])]) 
1234 

Jest to nieco lepiej:

>>>> sum([x * 10**i for i, x in enumerate([ord(x) - zero for x in s[::-1]])]) 
1234 

>>> atoi = lambda s: sum([x * 10**i for i, x in enumerate([ord(x) - zero for x in s[::-1]])]) 
>>> atoi("1234") 
1234 
1

What about just iterating through all the integers, converting them to strings and comparing strings?

import exceptions 
MAX_INT = 1000 
MIN_INT = -1000 

def str2int(s): 
    for i in range(MIN_INT,MAX_INT): 
    if s == str(i): 
     return i 
    raise exceptions.OverflowError 

def add2strings(s,t): 
    return str(str2int(s)+str2int(t)) 

print add2strings("170","-300") 
print add2strings("170","-1001") 

Daje:

"-170" 
Traceback (most recent call last): 
  Line 15, in <module> 
    print add2strings("170","-1001") 
  Line 12, in add2strings 
    return str(str2int(s)+str2int(t)) 
  Line 9, in str2int 
    raise exceptions.OverflowError 
OverflowError 
+3

Jedź do domu, jesteś pijana. –

+3

Nie możesz mi powiedzieć kiedy kodować i * hic * kiedy nie kodować. * hic * To dlatego jest * za darmo * maaaaan ... * za darmo jak w piwie *. –