2014-07-04 23 views
6

我試圖在Python中實現add2stringssub2stringsmult2strings函數。如果你只是做int(string),他們都非常簡單,但是我想在沒有這個的情況下完成它們,並且不需要導入另一個作弊行爲,比如Decimal。我目前的想法是使用bytes將字符串轉換爲不帶int的int()

是否有另一種方法可以做到這一點?

+4

我很*很想知道你爲什麼要這樣做。 –

+2

你可以拆分字符串來獲取字符,然後你可以用'0'來比較字符以獲得數字'0'等。 – furas

+0

編碼實踐。我比Python更喜歡Python,而不是C/C++ ATM。 –

回答

9

請參閱基本atoi在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; 
} 

它轉換到Python:

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

    return rtr 

測試:

>>> atoi('123456789') 
123456789 

如果要容納可選的符號並以空格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 

現在添加例外,你在那裏!

+0

不錯的比較:) – furas

+0

好主意,沒有意識到我可以通過做一個atoi,做算術,然後使用itoa來概括問題。我在考慮硬件和使用進位的計劃。 –

+0

當然,你需要修改來處理空白和一個可選的+或 - 和字符串的開始,但兩者都是微不足道的。 – dawg

2

這實在是低效的,但是:

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

這是稍微好一點:

>>>> 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") 

這給:

"-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

回家吧,你醉了。 –

+3

你不能告訴我何時編碼和* hic *何時不編碼。 * hic *這就是爲什麼*免費* maaaaan ... *免費在啤酒*。 –