aggiungendo le cifre di un numero

1

Sto cercando di scrivere un programma che chiede all'utente un numero decimale e quindi calcola la somma delle sue cifre. per esempio se il numero è 123.25 allora la somma sarà 1 + 2 + 3 + 2 + 5 = 13.

Ho deciso di trasformare prima il numero in 0.12325 (qualsiasi numero verrà formattato in questo modo ma sto usando l'esempio) e quindi spostare il punto decimale a destra in un punto e isolare le cifre una alla volta.

ecco cosa ho ottenuto (l'ho provato in python e c ++ ho lo stesso problema in entrambi):

number = float(raw_input ("please enter a Decimal number: "))
total = 0

while number >= 1:
    number = number / 10 ## turning 123.25 to 0.12325

while number > 0:
    number = number * 10 ## making 0.12325 to 1.2325
    total = total + int(number)  ## storing the digit on the left of the decimal point
    number = number  - int (number) ## getting rid of the digit left to the decimal point

print total

Il problema è che tutto funziona fino all'ultima cifra. Quando arriva al punto in cui è 5.0 rispetto all'istruzione numero = numero - int (numero) mi dà 1 anziché zero. Dovrebbe essere 5.0 - 5 = 0 ma non lo è.

Questo è quello che ottengo quando stampo il numero in ogni fase:

please enter a Decimal number: 123.25
0.12325
0.2325
0.325
0.25
0.5    ##### Here is where the problem starts #####
0.999999999999
0.999999999993
0.999999999929
..... here it goes on for  a while. I spared you the rest .....

Più precisamente, ho stampato il numero in ogni fase del ciclo:

please enter a Decimal number: 123.25

number at start of loop:  0.12325
number after 'number * 10' :  1.2325
number at the end of the loop:  0.2325

number at start of loop:  0.2325
number after 'number * 10' :  2.325
number at the end of the loop:  0.325

number at start of loop:  0.325
number after 'number * 10' :  3.25
number at the end of the loop:  0.25

number at start of loop:  0.25
number after 'number * 10' :  2.5
number at the end of the loop:  0.5

number at start of loop:  0.5
number after 'number * 10' :  5.0
number at the end of the loop:  0.999999999999

Tutto ad un tratto smette di essere accurato.

    
posta user170800 10.03.2015 - 19:25
fonte

1 risposta

2

Questo può essere fatto con il seguente one-liner python:

>>> f = 123.25
>>> sum(int(ch) for ch in str(f) if ch.isdigit())
13
>>>

Per analizzare come funziona:

Converti in string come @whatsisname raccomanda di evitare problemi di arrotondamento in virgola mobile

str(f)

Crea una lista contenente ciascun carattere

ch for ch in str(f)

Elimina tutto ciò che non è una cifra

ch for ch in str(f) if isdigit(ch)

Converti tutto il risultato in un int

int(ch) for ch in str(f) if isdigit(ch)

Somma tutto

sum(int(ch) for ch in str(f) if isdigit(ch))

Ci sono tre punti chiave qui:

  1. Non aver paura di convertire i numeri in stringhe. L'impatto sulle prestazioni di questo tipo di operazioni è in genere irrilevante per le macchine moderne e questo rende la manipolazione delle cifre molto più naturale
  2. Le liste di Python combinate con le funzioni standard sono estremamente utili per tutto ciò che implica "fai qualcosa con questo elenco di qualcosa".
  3. Quando usi la matematica in virgola mobile, non dovresti mai aspettarti risultati esatti tranne che in casi banali (come 0.0) a causa di problemi di precisione.
risposta data 10.03.2015 - 20:50
fonte

Leggi altre domande sui tag