2014-04-07 5 views
1

그래서 지금은 정수에 대한 빠른 입력 방법으로 codechef 문제에 대해이 기능을 사용하고 있습니다.C의 길고 긴 입력을위한 빠른 입력?

내 질문은 이것이 실제로 어떻게 작동하는지, fgetc_unlocked (stdin) (비록 주석이 달렸음에도 불구하고)가 무엇인지, 가장 중요하게 어떻게 장시간 및 장기간 실행하도록 최적화 할 수 있습니까? 코드가 있어야한다 것처럼

inline void Scan_f(int a) 
{ 
char c = 0; 
while(c<33)//shouldn't value of c to compare be less than 9 as digit vary between 0 to 9?? 
//c = fgetc_unlocked(stdin); 
c = getc(stdin); 
a = 0; 
while(c>33) 
{ 
a = a*10 + c - '0'; 
//c = fgetc_unlocked(stdin); 
c = getc(stdin); 
} 
+1

왜 'c> 33'대 'while (c>' ')'입니까? 왜'char c = 0' 대'int c = 0' 이냐구요. 질문 중 하나를 설명하는 덕분입니다. – chux

+0

@chux thanks .. 나는 일반 독자들에게 더 이해하기 쉽도록 코드 주석을 편집했다. 다른 질문은? – Danny

+0

'fgetc_unlocked'는 thread가 안전하지 않은'getc' 버전입니다. 프로그램이 단일 스레드로 보장된다면 성능이 약간 향상 될 수 있습니다. – oakad

답변

2

그것은 나에게 같습니다 : 여기

코드입니다

당신이 게시 코드에서
inline unsigned long long Scan_f() 
{ 
    int c; 
    do 
     c = fgetc(stdin); 
    while ((c < '0' || c > '9') && c != EOF); 

    unsigned long long a = 0; 
    while (c >= '0' && c <= '9') 
    { 
     a = a*10 + (c - '0'); 
     c = fgetc(stdin); 
    } 
    return a; 
} 

, a이 값에 의해 전달 된 매개 변수이므로이다 호출하는 함수가 a에 대한 변경 사항을 어떻게 알 수 있는지 명확하지 않습니다.

fgetc_unlocked 함수는 fgetc의 더 빠른 버전이라고 가정합니다. 그것은 GNU 확장입니다.

구문 분석에서 음수 값을 검색 할 수 없기 때문에 a이 서명 된 유형으로 인식되지 않습니다.

이 버전에서는 오버플로가 있는지 확인하지 않습니다. 그 가능성을 처리하려면 a = a*10하기 전에 수표를 추가해야합니다.

c < '0' 등의 섹션에서 효율성에 대해 걱정하지 마십시오. 컴파일러는 최적의 코드를 이미 생성합니다. 그들은 이처럼 간단한 상황을 잘 처리 할 수 ​​있습니다. 확실히 그것은 입력 스트림이 무엇이든간에 문자를 읽을 수있는 것보다 더 빨리 검사 할 수 있습니다. 입력 스트림 속도가 병목 현상이됩니다.

+0

감사합니다! 적절한 설명 : D. – Danny