2014-09-30 99 views
-4

我的目標是將下面用C編寫的代碼翻譯成Python,所以我可以通過一串數字來評估循環。最初,目標取值範圍爲0到9,爲每次迭代收集輸入,同時也相乘,然後求和整個範圍。最後所有的,確定由11相當於Python中的程序的Python

int checksum(char *str) { 
    int i, sum = 0; 
    for (i=0; i<9; i++) { 
     sum+= (str[i] - '0') * (i + 1); 
    } 
    return sum % 11; 
} 
+1

你的問題是什麼? – 2014-09-30 02:21:23

+2

如果你自己用C寫的,並且你理解它,你應該沒有麻煩將它翻譯成Python。請閱讀[教程](https://docs.python.org/2/tutorial/#the-python-tutorial)。你想看功能和循環。 – mhawke 2014-09-30 02:28:12

+0

我正在一個Python研究小組中,其中一位成員對這個問題的建議是用C語言提交的,這是一種我不熟悉的語言。我的回答是,'雖然我很欣賞這個建議,但我對C.並不熟悉。給我一天的時間來解釋Python中的建議。'我陷入僵局並尋求幫助。 – CNO 2014-09-30 02:34:22

回答

1

劃分代碼的直接(但不是很地道)的翻譯會是下面這樣,那我改名一些變量,以避免與Python的內置衝突通知後剩餘-in功能:

def checksum(s): 
    c = 0 
    for i in range(9): 
     c += int(s[i]) * (i + 1) 
    return c % 11 

另一個更Python的選擇是使用的,而不是顯式循環發電機表達式:

def checksum(s): 
    return sum(int(e) * i for i, e in enumerate(s[:9], 1)) % 11 
+1

如果你打算沿着這條路線走,那麼:'返回sum(int(val)* idx for idx,val in enumerate(s [:9],1))%11' – 2014-09-30 02:37:39

+0

@JonClements在值中開始枚舉'1'似乎是個好主意。 ''[:9]'部分我不太確定,我喜歡我的版本適用於長度不是'9'的字符串。但是如果輸入包含數字以外的字符(如果可以假設你的建議是好的),那麼'int(val)'部分將會失敗 – 2014-09-30 02:49:22

+0

我把9放入,因爲這是循環的OP的整個範圍 - 它可以當然可以刪除或者只是使它成爲'def checksum(s,n = None)',然後使它成爲'enumerate(s [:n],1)'或者其他東西。此外,OP要*評估循環中的一串數字*,所以我會堅持使用'int'來明確並得到驗證,否則就像'ord('!') - ord('0 ')'會對結果產生奇怪的影響。儘管我的2p。 – 2014-09-30 02:58:27