2016-01-01 10 views
5

Devo concatenare in modo incrementale un dato numero su ogni iterazione in modo che restituisca una somma e la stringa concatenata. Questo è il mio tentativo:Genera x + xx + xxx + xxxx ... per un dato intero (per 4 -> 4 + 44 + 444 ...)

def digit_sum_from_letters(x): 
    a = int("%s" % x) 
    b = int("%s%s" % (x,x)) 
    c = int("%s%s%s" % (x,x,x)) 
    d = int("%s%s%s%s" % (x,x,x,x)) 
    return a+b+c+d 
print digit_sum_from_letters(9) 

ritorno 11106

ma ho bisogno per generare la somma per qualsiasi dato intero quindi ho bisogno di un ciclo, ma mi sono bloccato.

Grazie!

+0

in che modo hai bisogno di un ciclo? Potresti essere più specifico? – saljuama

+3

Potrebbe chiarire l'obiettivo? Stai dicendo che se un utente entra in 2, dovrebbe essere (2 + 22), e se un utente entra in 3, dovrebbe essere (3 + 33 + 333)? O è qualcos'altro? – goodtimeslim

+2

Si noti che è necessario calcolare solo la somma ONES = 1 + 11 + 111 + ... + 1 ... 11. Una volta che hai questa somma, devi solo moltiplicare la cifra data per ONES. – chepner

risposta

4

Questo dovrebbe funzionare:

>>> def digit_sum(x): 
    lst = [str(x)*i for i in range(1,x+1)] 
    print '+'.join(lst) 
    return sum(map(int, lst)) 

>>> digit_sum(7) 
7+77+777+7777+77777+777777+7777777 
8641969 
>>> digit_sum(9) 
9+99+999+9999+99999+999999+9999999+99999999+999999999 
1111111101 
>>> digit_sum(3) 
3+33+333 
369 
2

Ci sono un paio di modi per farlo. Inizierò con la soluzione più simile alla tua e, se vuoi, posso introdurre un metodo probabilmente più veloce :).

def digit_sum_from_letters(digit,count): 
suma=0 
cur=digit 
for _ in xrange(count): 
    suma+=int(cur) 
    cur+=digit 
return suma 
1

funzione seguente farà, n è il numero (4) m è il numero di iterazioni (4, 44, 444, 4444, ...).

def digit_sum_from_letters(n, m): 
    sum = 0 
    # this is the multiplier. 
    # throughout the iterations it will be 1, 11, 111, 1111 ... 
    currMult = 1 
    for i in range(0,m): 
     sum += n*currMult 
     currMult = currMult*10 + 1 
    return sum 

Esempio run:

>>> sumLetters(9,4) 
11106 
>>> 
5

Dato digit e n (ad esempio, digit=4 e n=3 è 4 + 44 + 444), basta generare una sequenza di quelli, e moltiplicare la sua somma per digit.

digit = 4 
n = 3 
# 1, 11, 111 
ones = [ int("1" * i) for i in range(1, n+1)] 
# 4 + 44 + 444 = 4 * (1 + 11 + 111) 
answer = digit * sum(ones) 
+0

Le cose divertenti accadono quando non è solo una cifra :) OP non ha reso tale specifica haha – Untitled123

1
def sum_n(x, n): 
    s = 0 
    for i in range(1,n+1): 
     s += int(('%d'*i) % tuple([x]*i)) 
    return s 


In [0]: print(sum_n(9,4)) 
Out[0]: 11106 
1

è possibile farlo utilizzando la compressione lista:

x = 9 
c = 4 
sum([int(str(x) * i) for i in xrange(1,c + 1)]) 
11106 
2

Solo per divertimento:

def f(n): 
    return n*int("123456789"[:n]) 

Si dà:

1 -> 1 
2 -> 24 
3 -> 369 
4 -> 4936 
5 -> 61725 
6 -> 740736 
7 -> 8641969 
8 -> 98765424 
9 -> 1111111101 
2

Chi ti ha detto che hai bisogno di un ciclo? Non ascoltarli

def fn(n): 
    x,z = n,10 
    return x*(z*(z**n-1) // (z-1) - n) // (z-1) 

print(fn(1)) # 1 
print(fn(2)) # 24 
print(fn(3)) # 369 
print(fn(4)) # 4936 

EDIT: E 'un peccato che richiedono la stringa di espressione troppo. Da quella parte devi usare un ciclo tristemente

Problemi correlati