C++ – hoe de lengte van een geheel getal te vinden

Ik probeer een manier te vinden om de lengte van een geheel getal (aantal cijfers) te vinden en deze vervolgens in een geheeltallige array te plaatsen. De opdracht roept ook op om dit te doen zonder het gebruik van klassen van de STL, hoewel de programmaspecificatie zegt dat we “gewone C-bibliotheken” kunnen gebruiken (ik zal mijn professor vragen of ik cmath kan gebruiken, omdat ik aanneem log10(num) + 1 is de gemakkelijkste manier, maar ik vroeg me af of er een andere manier was).

Ah, en dit hoeft geen negatieve getallen te verwerken. Alleen niet-negatieve getallen.

Ik probeer een variant “MyInt”-klasse te maken die een groter bereik aan waarden aankan met behulp van een dynamische array. Alle tips worden op prijs gesteld! Bedankt!


Antwoord 1, autoriteit 100%

Het aantal cijfers van een geheel getal nin een willekeurige basis wordt triviaal verkregen door te delen totdat je klaar bent:

unsigned int number_of_digits = 0;
do {
     ++number_of_digits; 
     n /= base;
} while (n);

Antwoord 2, autoriteit 76%

Niet noodzakelijk de meest efficiënte, maar wel een van de kortste en meest leesbare in C++:

std::to_string(num).length()

Antwoord 3, autoriteit 50%

Er is een veel betere manier om het te doen

   #include<cmath>
    ...
    int size = trunc(log10(num)) + 1
....

werkt voor int en decimaal


Antwoord 4, autoriteit 35%

Als je C-bibliotheken kunt gebruiken, is een methode om sprintfte gebruiken, bijvoorbeeld

#include <cstdio>
char s[32];
int len = sprintf(s, "%d", i);

Antwoord 5, Autoriteit 21%

“Ik bedoel het aantal cijfers in een geheel getal, d.w.z.” 123 “heeft een lengte van 3”

int i = 123;
// the "length" of 0 is 1:
int len = 1;
// and for numbers greater than 0:
if (i > 0) {
    // we count how many times it can be divided by 10:
    // (how many times we can cut off the last digit until we end up with 0)
    for (len = 0; i > 0; len++) {
        i = i / 10;
    }
}
// and that's our "length":
std::cout << len;

Uitgangen 3


Antwoord 6, Autoriteit 12%

Gesloten formule voor de langste int(ik gebruikte inthier, maar werkt voor elk ondertekend integraal type):

1 + (int) ceil((8*sizeof(int)-1) * log10(2))

Uitleg:

                 sizeof(int)                 // number bytes in int
                8*sizeof(int)                 // number of binary digits (bits)
                8*sizeof(int)-1               // discount one bit for the negatives
               (8*sizeof(int)-1) * log10(2)   // convert to decimal, because:
                                              // 1 bit == log10(2) decimal digits
    (int) ceil((8*sizeof(int)-1) * log10(2))  // round up to whole digits
1 + (int) ceil((8*sizeof(int)-1) * log10(2))  // make room for the minus sign

Voor een inttype 4 bytes, het resultaat is 11. Een voorbeeld van 4 bytes intmet 11 decimale cijfers is: “-2147483648”.

Als u het aantal decimale cijfers van sommige intwaarde wilt, kunt u de volgende functie gebruiken:

unsigned base10_size(int value)
{
    if(value == 0) {
        return 1u;
    }
    unsigned ret;
    double dval;
    if(value > 0) {
        ret = 0;
        dval = value;
    } else {
        // Make room for the minus sign, and proceed as if positive.
        ret = 1;
        dval = -double(value);
    }
    ret += ceil(log10(dval+1.0));
    return ret;
}

Ik heb deze functie getest voor het hele bereik van intin g++ 9.3.0 voor x86-64.


Antwoord 7, autoriteit 9%

Een computernerd zijn en geen wiskundenerd zou ik doen:

char buffer[64];
int len = sprintf(buffer, "%d", theNum);

Antwoord 8, autoriteit 9%

int intLength(int i) {
    int l=0;
    for(;i;i/=10) l++;
    return l==0 ? 1 : l;
}

Hier is een kleine efficiënte


Antwoord 9, autoriteit 6%

Zou dit een efficiënte aanpak zijn? Converteren naar een string en de eigenschap length vinden?

int num = 123  
string strNum = to_string(num); // 123 becomes "123"
int length = strNum.length(); // length = 3
char array[3]; // or whatever you want to do with the length

Antwoord 10, autoriteit 6%

Wat dacht je van (werkt ook voor 0 en negatieven):

int digits( int x ) { 
    return ( (bool) x * (int) log10( abs( x ) ) + 1 );
}

Antwoord 11, autoriteit 6%

De beste manier is om te vinden met behulp van log, het werkt altijd

int len = ceil(log10(num))+1;

Antwoord 12, autoriteit 3%

Code voor het vinden van Lengte van int en decimaal getal:

#include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
        int len,num;
        cin >> num;
        len = log10(num) + 1;
        cout << len << endl;
        return 0;
    }
    //sample input output
    /*45566
    5
    Process returned 0 (0x0)   execution time : 3.292 s
    Press any key to continue.
    */

Antwoord 13

Er zijn geen ingebouwde functies in C/C++ noch in STL om de lengte van een geheel getal te vinden, maar er zijn weinig manieren waarop het kan worden gevonden
Hier is een voorbeeld C++-code om de lengte van een geheel getal te vinden, het kan in een functie worden geschreven voor hergebruik.

#include<iostream>
using namespace std;
int main()
{
  long long int n;
  cin>>n;
  unsigned long int integer_length = 0;
  while(n>0)
  {    
   integer_length++;
   n = n/10; 
  }
  cout<<integer_length<<endl;
 return 0;
}

Hier is een andere manier, converteer het gehele getal naar string en vind de lengte, het bereikt hetzelfde met een enkele regel:

#include<iostream>
#include<cstring>
using namespace std;
    int main()
    {
        long long int n;
    cin>>n;
    unsigned long int integer_length = 0;
    // convert to string
    integer_length = to_string(n).length();
    cout<<integer_length<<endl;
    return 0;
    }

Opmerking: Voeg het cstringheaderbestand

toe


Antwoord 14

De gemakkelijkste manier is:

#include <string> 
int int_length = to_string(42).length();

Antwoord 15

meest efficiënte code om de lengte van een nummer te vinden .. telt ook nullen, opmerking “N” is het nummer dat moet worden gegeven.

#include <iostream>
using namespace std;
int main()
{
    int n,len= 0;
    cin>>n;
while(n!=0)
    {
       len++;
       n=n/10;
    }
    cout<<len<<endl;
    return 0;
}

Other episodes