Ho un numero intero e ho bisogno di scoprire quante cifre ci sono dentro.C++ equivalente alla funzione len() di Python?
risposta
Un po 'difficile da gestire numeri negativi e il caso in cui l'ingresso è zero:
int length(int n)
{
int len = 0;
if (n < 0) { len = 1; n = -n; }
while (n > 9) {
n /= 10;
len++;
}
return len+1;
}
Non esiste funzione disponibile nella libreria C++. Tuttavia è possibile utilizzare std::stringstream
per semplicità.
Prova questo (gestisce anche i numeri negativi).
int a =-12345,x;
x = std::abs(a)
std::stringstream s;
s << x;
std::cout<<s.str().size();
La localizzazione e il factoring sono buoni: 'x = a <0? -a: a; ', ma dovrei mollare x e mettere quell'espressione direttamente nel flusso. Molto C++, ma molto pesante. –
È necessario continuare a dividerlo per 10 (presupponendo che sia un numero intero). Lo fai perché rimuovi una cifra ogni volta che il ciclo itera.
qualcosa sulla falsariga di:
int number;
int digits;
while (number > 0)
{
digits++;
number /= 10;
}
Probabilmente si vorrà per assicurarsi che il numero non è pari a zero per cominciare.
Per i numeri positivi, utilizzare log10:
int a = 1234;
int len = static_cast<int>(log10(a)+1.);
Se avete bisogno di essere approfondito:
int length(int a)
{
int b = abs(a);
if (b == 0) return 1;
return static_cast<int>(log10(b)+1.);
}
Detto questo, sarebbe una scelta migliore per fare la divisione ripetuta da 10 in pratica.
int length(int a)
{
int b = 0;
for (a = abs(a); a != 0; b++, a /= 10) continue;
return b;
}
Inizia la domanda, lo standard consente un'implementazione in cui dire 'log10 (10)' restituisce 0.9999999999 ...? Semplicemente non so (o mi fido delle implementazioni da rispettare come faranno qualunque cosa faccia il loro hardware), quindi preferisco l'approccio int per cifra anche se questo è matematicamente più elegante. Pensieri? –
Questo sottostima di 1 - es. per il tuo esempio 1234, restituisce 3. Inoltre, non viene compilato (almeno in VC++) perché la chiamata a log10 è ambigua - è necessario eseguire il cast esplicito per il primo a un doppio. E immagino che intendessi passare b in log10 invece di un? – Peter
Sei fuori di testa. log10 (5) è 0.6989700 ... quando lo si restituisce a un int, si ottiene 0. '5' ha certamente più di zero cifre. Inoltre, prendi gli addominali (a) e li metti in b, ma poi vai avanti e prendi il log10 di (possibilmente non positivo) comunque – SingleNegationElimination
Probabilmente significa che avete una stringa contenente numeri, piuttosto che un int in pitone:
>>> i = 123456789
>>> len(i)
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: object of type 'int' has no len()
>>> len(str(i))
9
Se questo è anche il caso in C++ è facile trovare la lunghezza di una stringa utilizzando:
my_str_value.length()
o di una stringa C utilizzando strlen
Ecco un littl E Esempio:
int numberDigits(int n) {
char buffer[100];
itoa(n,buffer,10);
int len=0;
while (buffer[len]!=0) { len++; }
return len;
}
Worth lista come alternativa. Dovrebbe saltare qualsiasi "-" iniziale. Nonostante evitando strlen(), solo l'atoi() è sicuro di essere più lento rispetto ad altre soluzioni div-by-10 .... –
che sarebbe un problema se la velocità è molto sensibile nella sua domanda. –
Hmm ... Python:
>>> len(5)
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
len(5)
TypeError: object of type 'int' has no len()
non quello che volevi?
beh, supponiamo di avere un intero effettivo. la base di log 10 ti dirà cosa vuoi sapere numericamente, ovvero se yournumber == pow(10, digits)
, quindi log10(yournumber) == digits
! sfortunatamente, se il tuo numero non è una potenza esatta di 10, avrai una parte frazione da gestire. Questo è abbastanza facile da affrontare, però, con la funzione floor()
, che si conclude semplicemente. diffidare dei numeri negativi, poiché i logaritmi non sono definiti nei numeri reali per i valori non positivi.
#include <iostream>
#include <math.h>
int main()
{
std::cout << floor(log10(5))+1 << std::endl;
std::cout << floor(log10(30))+1 << std::endl;
std::cout << floor(log10(2000))+1 << std::endl;
std::cout << floor(log10(16000))+1 << std::endl;
}
dobbiamo aggiungere 1 perché 10 al 1 ° è ancora 10, quindi siamo fuori da uno. Aggiungi uno all'esponente e hai cifre!
Ottima spiegazione.+1 Come ti senti riguardo ai possibili problemi di precisione con virgola mobile che sono stati sollevati nei commenti della mia risposta? – JoshD
@JoshD: beh, 'log10 (x)' non è definito per x non positivi, ma a parte questo problema, questo sarà sempre corretto. Si noti che 'log10 (10.0)' è esattamente 1.0. il piano di questo è 1, 1 + 1 è due. – SingleNegationElimination
Ignorando per il momento che len()
in pitone restituisce il numero di elementi in una sequenza e non il numero di cifre di un numero intero, ecco una funzione per contare il numero di cifre di un numero intero senza divisoria (Così dovrebbe essere molto più veloce delle soluzioni simili che usano la divisione).
int number_of_digits(int value)
{
int count = 0;
int i = 1;
if (value < 0)
{
value *= -1;
}
while (i < value)
{
count++;
i *= 10;
}
if (count > 0)
{
return count;
}
else
{
return 1;
}
}
Per la velocità in più, si può anche sostituire la moltiplicazione per dieci con una certa punta giocherellando:
i = ((i << 2) + i) << 1;
(Lo spostamento bit è fresco, ma la moltiplicazione può essere "libero" se la CPU può pipeline la moltiplicazione su qualche unità di moltiplicazione altrimenti inutilizzata - i processori moderni sono una cosa di bellezza).
- 1. Python xml.etree.ElementTree equivalente alla libreria XML C++
- 2. Esiste un equivalente alla funzione MATLAB bsxfun in python?
- 3. Dojo equivalente alla funzione jQuery.text?
- 4. Equivalente Python di C++ getline()
- 5. Java Equivalente alla funzione iif
- 6. Esiste un Python equivalente alla funzione smooth.spline in R
- 7. Python: come `len()` viene eseguito
- 8. Esiste un Python equivalente alla funzione PHP htmlspecialchars()?
- 9. JSP equivalente alla funzione include() di PHP?
- 10. SQLite equivalente alla funzione GREATEST di PostgreSQL
- 11. Equivalente Python della funzione "ismember" di MATLAB
- 12. Java equivalente di mappatura funzione in Python
- 13. Esiste una ruggine equivalente alla funzione orologio in C++?
- 14. Clojure equivalente alla libreria lxml di Python?
- 15. C# equivalente alla risorsa Java
- 16. Equivalente di __func__ (da C) in Python
- 17. C equivalente alla sbirciatina di fstream
- 18. C# Parallel.Foreach equivalente in Python
- 19. Equivalente di Python della funzione perl vec()
- 20. passare l'oggetto C++ alla funzione python da boost :: python
- 21. Equivalente C della funzione "setw"
- 22. Funzione Java di Python equivalente wait(), notify(), sincronizzata
- 23. Esiste una funzione equivalente alla funzione Oracle NVL in Mysql?
- 24. Passa l'elenco di Python alla funzione Ruggine
- 25. Esiste un equivalente in Scala alla funzione di mappa più generale di Python?
- 26. C# equivalente di perl $ _
- 27. di Python equivalente
- 28. Perché no len (file) in Python?
- 29. Python, len e dimensione degli interi
- 30. Esiste un javery JavaScript o jQuery equivalente alla funzione "somma" di Python?
+1 per un approccio attento e veloce. La specifica prevedeva il conteggio delle cifre, quindi non è necessario impostare separatamente i valori negativi. Può avviare len a 1 e restituire len. –