2012-10-08 2 views
4

C/C++에서 큰 숫자 (최대 22 자)를 대량으로 (최대 2^24) 읽어야합니다. 그런 읽기를 수행하는 방법? 번호는 공백으로 구분되며 새 줄까지 모두 읽어야합니다. getch()를 사용하여 배열을 채우거나 더 똑똑한 해결책이 있습니까?많은 양의 숫자를 읽는 방법은 무엇입니까?

+2

메모리가 파일을 매핑하고 포인터 연산을 사용합니까? –

+0

'C'또는'C++'? C++의 경우 스트림 및 벡터를 사용합니다. – TZHX

+0

'stdin' 또는 파일에서? 그리고 C 나 C++을 사용하고 싶습니까? – Mike

답변

4

"숫자"는 무엇입니까? 그것들이 정수인 경우, 큰 수의 경우 C에 내장 된 지원이 없다. "bignum"지원을위한 라이브러리가 필요합니다. 부동 소수점 일 경우 double을 시도 할 수 있지만 정밀도가 충분하지 않을 수 있습니다.

데이터에 대해 더 알지 못하면 더 구체적으로 표현하기가 어렵습니다. 그렇지 않으면 매우 애매하기 때문에 질문에 숫자 중 일부를 표시하는 것을 고려해보십시오.

+0

GMP를 사용하여 처리 할 것이므로, 걱정할 필요가 없습니다. – deha

+0

일반적으로 정수가 될 것입니다. – deha

2

읽기가 단일 스레드 인 경우 getchar_unlocked()을 사용하면 각 작업에 대한 스트림을 잠그는 오버 헤드를 피할 수 있습니다. 문자 단위로 이동하고 숫자를 누적하여 공백을 기다립니다.

int *data = new int[MAX_LEN]; 
int *ptr = data; 
int ch; 
*ptr = 0; 
while ((ch = getchar_unlocked()) != '\n') { 
    if (ch == ' ') { 
     ptr++; 
     *ptr = 0; 
    } else { 
     *ptr = (*ptr *10) + (ch -'0'); 
    } 
} 

이 조각은 오류 검사로 "중요하지 않은"물건을 무시 물론, 그러나 당신의 입력이 "소독"때 그것은 OK입니다 : 당신이 공간을 볼 때, 수를 저장하고, 현재의 값을 제로 . 예를 들어 ACM 온라인 판사가 I/O 비용을 절약하기 위해 이와 같은 것을 사용할 수 있습니다.

0

우선 정수를 저장하는 데 적절한 유형이 필요합니다. 64 비트 정수보다 크기 때문에 구조화 된 유형이 필요할 것입니다. 당신은

http://gmplib.org/

같은

는 사용을위한 그것의 문서를 읽고, 도서관을 직접 작성하거나 사용할 수 있습니다.

그런 다음 합계, 변환, 검색 또는 전송과 같은 숫자로 원하는 것을 명확하게해야합니다. 아는 것이 있으면 정수에 사용한 데이터 유형을 조작 할 수 있습니다.

+0

평균 계산과 같은 몇 가지 기본 계산을 수행해야합니다. 당신이 언급 한 GMP – deha

+0

문자열의 유효성을 검사하고 숫자로 파싱하기 전에 문자를 저장하기 위해 문자열 버퍼가 필요할 수도 있습니다. – FamZheng

관련 문제