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))));
이것은 음수에서도 작동합니다.