[c#] int (C #)의 첫 번째 숫자를 어떻게 얻을 수 있습니까?

C #에서 int의 첫 번째 숫자를 얻는 가장 좋은 방법은 무엇입니까? 내가 생각 해낸 방법은 int를 문자열로 바꾸고 문자열의 첫 번째 문자를 찾은 다음 다시 int로 바꾸는 것입니다.

int start = Convert.ToInt32(curr.ToString().Substring(0, 1));

이것이 작업을 수행하는 동안 아마도 그러한 문제에 대한 훌륭하고 간단한 수학 기반 솔루션이있는 것처럼 느껴집니다. 문자열 조작이 어색해집니다.

편집 : 속도 차이에 관계없이 Substring () 대신 mystring [0]은 여전히 ​​문자열 조작입니다.



답변

방법은 다음과 같습니다.

int i = Math.Abs(386792);
while(i >= 10)
    i /= 10;

그리고 i당신이 필요로 포함됩니다


답변

벤치 마크

첫째, 알고리즘의 효율성, 가독성 / 유지 보수 가능성 및 향후 버그가 발생할 가능성을 고려하여 “최상의”솔루션이 의미하는 바를 결정해야합니다. 그러나 신중한 단위 테스트는 일반적으로 이러한 문제를 피할 수 있습니다.

이 예제를 각각 천만 번 실행했으며 결과 값은 ElapsedTicks통과 한 수입니다.

더 이상 고민하지 않고 가장 느린 것부터 가장 빠른 것까지 알고리즘은 다음과 같습니다.

문자열로 변환, 첫 번째 문자 가져 오기

int firstDigit = (int)(Value.ToString()[0]) - 48;

결과 :

12,552,893 ticks

로그 사용

int firstDigit = (int)(Value / Math.Pow(10, (int)Math.Floor(Math.Log10(Value))));

결과 :

9,165,089 ticks

루핑

while (number >= 10)
    number /= 10;

결과 :

6,001,570 ticks

조건부

int firstdigit;
if (Value < 10)
     firstdigit = Value;
else if (Value < 100)
     firstdigit = Value / 10;
else if (Value < 1000)
     firstdigit = Value / 100;
else if (Value < 10000)
     firstdigit = Value / 1000;
else if (Value < 100000)
     firstdigit = Value / 10000;
else if (Value < 1000000)
     firstdigit = Value / 100000;
else if (Value < 10000000)
     firstdigit = Value / 1000000;
else if (Value < 100000000)
     firstdigit = Value / 10000000;
else if (Value < 1000000000)
     firstdigit = Value / 100000000;
else
     firstdigit = Value / 1000000000;

결과 :

1,421,659 ticks

펼쳐지고 최적화 된 루프

if (i >= 100000000) i /= 100000000;
if (i >= 10000) i /= 10000;
if (i >= 100) i /= 100;
if (i >= 10) i /= 10;

결과 :

1,399,788 ticks

노트 :

Random.Next()다음을 얻기 위해 각 테스트 호출int


답변

이 시도

public int GetFirstDigit(int number) {
  if ( number < 10 ) {
    return number;
  }
  return GetFirstDigit ( (number - (number % 10)) / 10);
}

편집하다

여러 사람이 루프 버전을 요청했습니다.

public static int GetFirstDigitLoop(int number)
{
    while (number >= 10)
    {
        number = (number - (number % 10)) / 10;
    }
    return number;
}


답변

내가 생각 해낼 수있는 최선의 방법은 다음과 같습니다.

int numberOfDigits = Convert.ToInt32(Math.Floor( Math.Log10( value ) ) );

int firstDigit = value / Math.Pow( 10, numberOfDigits );


답변

Anton의 대답에 대한 변형 :

 // cut down the number of divisions (assuming i is positive & 32 bits)
if (i >= 100000000) i /= 100000000;
if (i >= 10000) i /= 10000;
if (i >= 100) i /= 100;
if (i >= 10) i /= 10;


답변

int myNumber = 8383;
char firstDigit = myNumber.ToString()[0];
// char = '8'


답변

Lennaert와 같은 아이디어를 가졌습니다.

int start = number == 0 ? 0 : number / (int) Math.Pow(10,Math.Floor(Math.Log10(Math.Abs(number))));

이것은 음수에서도 작동합니다.