문자열 캐스트없이 정수에서 숫자를 세는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/554521

  •  23-08-2019
  •  | 
  •  

문제

이 질문에 대한 간단하고 명백한 대답이 있을까 걱정됩니다. 품목 수의 숫자가 얼마나 많은지 결정해야하므로 각 항목 번호를 최저한의 정렬을 유지하는 데 필요한 주요 0의 수. 예를 들어, 총이 10에서 99 사이 인 경우 총계가 <10, 1 인 경우 주요 0을 원하지 않습니다.

한 가지 해결책은 항목 수를 문자열로 캐스트 한 다음 문자를 계산하는 것입니다. 왝! 더 좋은 방법이 있습니까?

편집 : 나는 일반적인 로그 (나는 그런 것이 존재한다는 것을 몰랐다). 나에게 분명하지는 않지만 확실히 단순합니다.

도움이 되었습니까?

해결책

이렇게해야합니다.

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

다른 팁

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

부정적인 부호를 설명해야 할 수도 있습니다 ..

곱하기가있는 진술이면 반복 된 분할보다 더 효율적인 솔루션이 반복 될 것입니다 ... 예 : N은 자릿수 수가 필요한 수입니다)

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

항목 수에 합리적인 상한이있는 경우 (예 : 서명되지 않은 INT의 32 비트 범위) 일부 정적 배열의 구성원과 비교하는 것이 더 나은 방법입니다.

// 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;

.NET에서 숫자를 채우려면

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

원하는대로 할 수 있습니다.

정수 산술 만 사용하기 때문에 로그보다 빠를 수있는 while 루프를 사용할 수 있습니다.

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

독자 가이 알고리즘을 조정하여 0과 음수를 처리하기 위해 연습으로 남겨 둡니다.

나는 의견을 게시했지만 내 담당자 점수는 그 차이를 부여하지 않을 것입니다.

내가 지적하고 싶었던 것은 로그 (10)가 매우 우아한 (읽기 : 매우 적은 줄의 코드) 솔루션이지만 프로세서에서 가장 세금이 부과 될 수 있다는 것입니다.

Jherico의 답변은 아마도 가장 효율적인 해결책이라고 생각합니다. 따라서 보상을 받아야합니다.

특히 많은 숫자 로이 일을하려고한다면 ..

숫자는 제로를 선도하지 않기 때문에 어쨌든 추가로 변환하고 있습니다. 최종 결과가 줄을 찾기 위해 피하기 위해 왜 그렇게 열심히 노력하고 있는지 잘 모르겠습니다.

하나의 솔루션은 기본 10 로그에서 제공합니다.

루프를 통과하고 삭제할 수 있으며 루프 횟수를 계산할 수 있습니다.

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

좋아, 저항 할 수 없어 : 사용 /=:

#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 $ 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top