Vra

Ek vrees dat daar 'n eenvoudige en voor die hand liggende antwoord op hierdie vraag is.Ek moet bepaal hoeveel syfers wyd 'n aantal items is, sodat ek elke itemnommer kan vul met die minimum aantal voorste nulle wat nodig is om belyning te handhaaf.Ek wil byvoorbeeld geen voorste nulle hê as die totaal < 10 is nie, 1 as dit tussen 10 en 99 is, ens.

Een oplossing sou wees om die itemtelling na 'n string te gooi en dan karakters te tel.Jok!Is daar 'n beter manier?

Wysig:Ek sou nie gedink het om die te gebruik nie algemene logaritme (Ek het nie geweet so iets bestaan ​​nie).Dus, nie voor die hand liggend nie - vir my - maar beslis eenvoudig.

Was dit nuttig?

Oplossing

Dit moet dit doen:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;

Ander wenke

int length = (int)Math.Log10(Math.Abs(number)) + 1;

Dit mag nodig wees om rekenskap te gee vir die negatiewe teken ..

'n meer doeltreffende oplossing as herhaalde verdeling sou herhaal word indien state met vermeerder ... bv (Waar n die aantal wie se nommer van syfers vereis)

unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
  ++digits;
  test *= 10;
}

As daar 'n paar redelike bogrens op die item telling (bv die 32-bit verskeidenheid van 'n ongetekende int) dan 'n nog beter manier is om te vergelyk met lede van 'n paar statiese skikking, Bv.

// this covers the whole range of 32-bit unsigned values
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };

unsigned int digits = 10;
while(n < test[digits]) --digits;

As jy gaan om pad die getal in Net, dan

num.ToString().PadLeft(10, '0') 

kan doen wat jy wil.

Jy kan 'n rukkie loop, wat waarskynlik vinniger as 'n logaritme sal wees gebruik omdat dit gebruik heelgetal rekenkundige net:

int len = 0;
while (n > 0) {
    len++;
    n /= 10;
}

Ek laat dit as 'n oefening vir die leser om hierdie algoritme aan te pas by nul en negatiewe getalle te hanteer.

Ek sou 'n opmerking geplaas het, maar my rep-telling sal my nie daardie onderskeiding gee nie.

Al wat ek wou uitwys, was dat selfs al is die Log(10) 'n baie elegante (lees:baie min reëls kode) oplossing, is dit waarskynlik die een wat die verwerker die meeste belas.

Ek dink jherico se antwoord is waarskynlik die mees doeltreffende oplossing en moet daarom as sodanig beloon word.

Veral as jy dit vir baie getalle gaan doen..

Sedert 'n aantal nie lei nulle het, is jy die omskakeling in elk geval om hulle by te voeg. Ek is nie seker waarom jy so hard probeer om dit te vermy om die lengte te vind wanneer die eindresultaat sal 'n string in elk geval wees.

Een oplossing is verskaf deur basis 10 logaritme, 'n bietjie overkill.

Jy kan loop deur en verwyder met 10, tel die aantal kere wat jy lus;

int num = 423;
int minimum = 1;
while (num > 10) {
    num = num/10;
    minimum++;
}

Goed, kan ek nie die versoeking weerstaan: gebruik /=:

#include <stdio.h>

int
main(){
        int num = 423;
        int count = 1;
        while( num /= 10)
                count ++;
        printf("Count: %d\n", count);
        return 0;
}
534 $ gcc count.c && ./a.out
Count: 3
535 $ 
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top