2014-04-21 4 views
0

내가 134658과 같은 숫자를 가지고 있고 "6"인 3 자리 (수백 자리)를 원한다고 가정 해 봅시다.값에서 숫자를 가져 오는 가장 짧은 방법

Objective-C에서 가장 짧은 길이의 코드는 무엇입니까?

이 내 현재 코드입니다 :

int theNumber = 204398234; 
int theDigitPlace = 3;//hundreds place 
int theDigit = (int)floorf((float)((10)*((((float)theNumber)/(pow(10, theDigitPlace)))-(floorf(((float)theNumber)/(pow(10, theDigitPlace))))))); 

//Returns "2" 
+0

방금 ​​숫자를 얻으려고합니까? – Pavan

+0

@Pavan Nope, 주어진 숫자를 얻으려고합니다. –

답변

2

가 아마 더 나은 솔루션은, 그러나 이것은 짧은 약간입니다 :

귀하의 경우
int theNumber = 204398234; 
int theDigitPlace = 3;//hundreds place 
int theDigit = (theNumber/(int)(pow(10, theDigitPlace - 1))) % 10; 

, 그것은 2,043,982를 얻기 위해 100 수를 분할 "나머지 연산자"가있는 마지막 소수점 자리를 "추출합니다"%.

비고 :이 솔루션은 pow(10, theDigitPlace - 1)의 결과가 정확한 있다고 가정합니다. 이는 double에 약 16 자리의 유효 자릿수가 있고 iOS에서 int이 이고 32 비트 숫자이며 10 자릿수가 10 자이기 때문에 작동합니다.

+0

+1 0o0o 솔루션 작동 방식에 대해 설명해 주신 내용은 상당히 영리합니다. 문제를 풀려고 할 때 남은 연산자를 사용하여 마지막 숫자를 얻을 수 있었지만 숫자를 조정하는 방법에 지나치게 생각했습니다. 호기심을 위해서, 당신이 최종 해결책을 생각해 낼 때 당신의 사고 계획이 어떤 것인지 설명해 주시겠습니까? 다시, 매우 시원한. – Pavan

+1

@Pavan : 거의 다 왔어. 'x % 10'이 마지막 숫자를 준다면,'(x/10) % 10'은 마지막으로 하나의 숫자를 제공합니다 ... –

+0

위대한, 그리고 당신은 10의 힘을줌으로써 똑똑하게 조정했습니다. x를 옮겨 놓고 싶어. 단! 감사합니다 – Pavan

1

어때?

int theNumber = 204398234; 
char output[20]; //Create a string bigger than any number we might get. 
sprintf(output, "%d", theNumber); 
int theDigit = output[strlen(output)-4]-'0'; //index is zero-based. 

정말 2 개의 실행 가능 라인입니다.

당신의 점수는 단 한 줄에 불과하지만, 그 점수는 당신이 가지고있는 이해하기 어려운 표정이며, 매우 느린 초월 수학을 사용합니다.

참고 : 왼쪽에서 세 번째 숫자 대신 오른쪽에서 세 번째 숫자를 가져 오도록 수정되었습니다. (내 실수를 잡기위한 감사 @Maddy)

+0

물론 성능은'sprintf'가 내부적으로 무엇을하는지에 달려 있습니다. 벤치마킹하지 않고'pow'보다 느리거나 빠르다고 말하는 것이 어렵습니다. –

+2

올바르지 않습니다. 그것은 수백 자리가 아닌 왼쪽에서 세 번째 자리를 제공합니다. – rmaddy

+1

@maddy, 아, 네 말이 맞아. 내 실수를 바로 잡기 위해 편집 됨. –

1

정수 수학을 사용하는 다른 솔루션과 단 한 줄의 코드 :

int theNumber = 204398234; 
int result = (theNumber/100) % 10; 

이 가능성이 아직 제안 가장 빠른 솔루션입니다.

수백 자리를 1 자리로 이동 한 다음 모듈로 산술을 사용하여 가장 낮은 자리의 10 진수를 제외한 모든 항목을 제거합니다.

+0

나는이 해결책을 좋아합니다! (* 사이드 노트 -베이스 10 만 해당) –

+1

"이베이스 10 만입니다." 네. 그게 문제가 진술 된 방법입니다. 그러나 동일한 솔루션을 사용하려는 모든 기지에서 사소한 것입니다. 숫자를 기본^digit_number로 나누고 그 결과를 모듈로 (기본)로 취하십시오. –