2014-07-04 49 views
6

Tôi đang cố gắng triển khai các hàm add2strings, sub2strings, mult2strings bằng Python. Tất cả chúng đều rất dễ dàng nếu bạn chỉ cần làm int(string), nhưng tôi muốn thực hiện chúng mà không cần điều đó và không nhập một thứ gian lận khác như Decimal. Ý tưởng hiện tại của tôi là sử dụng bytes.Chuyển đổi chuỗi thành Int mà không int()

Có cách nào khác để thực hiện việc này không?

+4

Tôi rất * rất tò mò muốn biết tại sao bạn muốn làm điều này. –

+2

Bạn có thể tách chuỗi để lấy ký tự và sau đó bạn có thể so sánh char với '" 0 "' để lấy chữ số '0', v.v. – furas

+0

Thực hành mã hóa. Và tôi thích Python nhiều hơn C/C++ ATM. –

Trả lời

9

Tham khảo một cơ bản atoi trong 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; 
} 

Những dịch vào Python:

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

    return rtr 

thử nghiệm nó:

>>> atoi('123456789') 
123456789 

Nếu bạn muốn để phù hợp với một dấu hiệu bắt buộc và khoảng trống cách mà int thực hiện:

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 

Bây giờ, thêm ngoại lệ và bạn đang ở đó!

+0

So sánh tốt đẹp :) – furas

+0

Ý tưởng hay, không nhận ra tôi chỉ có thể khái quát hóa các vấn đề bằng cách tạo ra một atoi, làm số học và sau đó sử dụng một itoa. Tôi đã suy nghĩ về phần cứng và lập kế hoạch sử dụng các bit mang theo. –

+0

Tất nhiên bạn sẽ cần phải sửa đổi để xử lý khoảng trắng và một tùy chọn + hoặc - và bắt đầu của chuỗi, nhưng cả hai đều tầm thường để làm. – dawg

2

Điều này thực sự không hiệu quả nhưng:

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

Đây là tốt hơn một chút:

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

Điều này cho phép:

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

Về nhà, bạn say rượu. –

+3

Bạn không thể cho tôi biết khi nào mã và * hic * khi không mã hóa. * hic * Đó là lý do tại sao * miễn phí * maaaaan ... * miễn phí như trong bia *. –

Các vấn đề liên quan