0

今日の私の質問は、私が Euler 145 の正しい道を進んでいるかどうか、そしてそれがちょっと効率的かどうかです。私はそれのほとんどをダウンさせました。私のDefの1つだけが、偶数チェックのために int(str(numb)[:i])%2==0 で問題を引き起こしています。私のコードは以下です。ライン 10 は問題点です

def reversed(reg): # to flip the number around
    fliped = str(reg)[::-1];
    return(int(fliped)); # Return it as a int. 

def allEvenDigits(numb): # This is the issue one
    hasEvenNumb = False;
    for i in range(0, len(str(numb))):
        if int(str(numb)[:i])%2 == 0:  # if int of the string numb's char at i is even
            hasEvenNumb = True; ## return that it is true
            break; # why go on if we found a even. 
    return(hasEvenNumb);


for i in range(1, 1000): # its 1000 to save a few minutes
    revNumb = reversed(i);
    total = revNumb+i;
    if(allEvenDigits(total)):
        print(i, "+" , revNumb, "=",Total);
4

3 に答える 3

1

組み込み関数all()を使用し、set を使用して、既に解かれた数値を追跡できます。たとえば、解決した場合36、解決する理由はありません63

seen = set()

def allEvenDigits(numb): # This is the issue one
    return all( int(n)%2 == 0 for n in str(numb))

for i in range(1, 1000): # its 1000 to save a few minutes
    revNumb = reversed(i);
    total = revNumb+i;

    if i not in seen and revNumb not in seen:
        if (allEvenDigits(total)):
            print(i, "+" , revNumb, "=",total);
            seen.add(i)
            seen.add(revNumb)

出力:

(1, '+', 1, '=', 2)
(2, '+', 2, '=', 4)
(3, '+', 3, '=', 6)
(4, '+', 4, '=', 8)
(11, '+', 11, '=', 22)
(13, '+', 31, '=', 44)
(15, '+', 51, '=', 66)
(17, '+', 71, '=', 88)
(22, '+', 22, '=', 44)
(24, '+', 42, '=', 66)
(26, '+', 62, '=', 88)
(33, '+', 33, '=', 66)
(35, '+', 53, '=', 88)
(44, '+', 44, '=', 88)
...

ヘルプall: _

>>> all?
Type:       builtin_function_or_method
String Form:<built-in function all>
Namespace:  Python builtin
Docstring:
all(iterable) -> bool

Return True if bool(x) is True for all values x in the iterable.
If the iterable is empty, return True.
于 2013-05-11T03:50:42.413 に答える
0
def sumrevers(x):
    summation = x + int(str(x)[::-1])
    if summation % 2 != 0: return summation


def checknum(x):
    if not (str(x)[-1] == "0") or (str(x)[0] == "0"):
        if type(sumrevers(x)) == int:
            num = str(sumrevers(x))
            checklis = [k for k in str(num)]
            if all(int(i) % 2 != 0 for i in checklis): return True


cnt = 0
for i in xrange(1, 1000000001):
    if checknum(i):
        cnt += 1
print cnt
于 2016-02-21T02:09:05.000 に答える
0

範囲が の場合、空の文字列から始めていますrange(0, len(str(numb)))。あなたはそれを解決することができます:

def allEvenDigits(numb): # This is the issue one
    hasEvenNumb = False;
    for i in range(1, len(str(numb))):
        if int(str(numb)[:i])%2 == 0:  # if int of the string numb's char at i is even
            hasEvenNumb = True; ## return that it is true
            break; # why go on if we found a even. 
    return(hasEvenNumb);

>>> allEvenDigits(52)
False

ただし、各数値が偶数かどうかを確認する方が簡単なようです。

def allEvenDigits(numb):
    hasEvenNumb = True
    for char in str(numb):
        if int(char) % 2 == 0:
            hasEvenNumb = False
            break
    return hasEvenNumb

allEvenDigits(52)

もう少し単純にして、部分文字列ではなく個々の数字のみをチェックします。

于 2013-05-11T03:43:54.957 に答える