2013-06-01 3 views
0

입력 스트림에 정수 Ai (0 ≤ Ai ≤ 10^(18))가 들어있는 problem을 풀고 있습니다. 숫자는 공백과 줄 바꿈으로 구분됩니다. 입력 스트림의 크기는 256KB를 초과하지 않습니다. 다음C++ - 입력 스트림의 크기

내 코드는 : -

#include<math.h> 
#include<iostream> 
using namespace std; 
int main(void) 
{ 
    long int index,i; 
    cin>>index; 
    int *arr=new int[index]; 
    if(sizeof(*arr)<262144) // 262144 = 256*1024 bytes which I think might be the size of the array          
    { 
     for(i=0;i<index;i++) 
      cin>>*(arr+i); 
     for(i=index-1;i>=0;i--) 
      cout<<sqrt(*(arr+i))<<endl; 
    } 
    else 
     return -1; 
    return 0; 
} 

생성 된 출력의 문제점은 I 배열에 입력해야하는 요소의 수를 입력하도록 사용자에게 요구한다는 것이다. 그러나 프로그램은 그것을 원하지 않습니다. 스트림을 통해 필요한 숫자를 입력하기를 원하지만 그렇게 할 수 없습니다. 또한 "입력 스트림의 크기"에 혼란 스럽습니다.이 "입력 스트림의 크기"는 무엇을 의미합니까? 이걸 내게 기쁘게 해 줄 수 있니?

+0

이렇게하려면 배열이 필요하지 않습니다. 그냥 읽고 처리하십시오. – chris

+0

[stack] (http://en.wikipedia.org/wiki/Stack_ (abstract_data_type)) 데이터 구조를 사용한다고 가정합니다. – Lol4t0

+0

하지만 스트림에 얼마나 많은 숫자가 있는지 알아야합니까? 그렇다면 표준 I/O 스트림을 사용하여 어떻게해야합니까? – kusur

답변

0

입력 스트림의 크기는 입력 스트림의 바이트 수입니다. 코드 부분 :

int *arr=new int[index]; 
if(sizeof(*arr)<262144) 

이 올바르지 않습니다. *arr은 정수이며 조건은 항상 true입니다.

while (read number) 
    stack.push(sqrt(number)) 
while (stack has elements) 
    print top of stack 
    pop stack 

입력 스트림의 크기에 대한 힌트는 고정 된 크기로 배열 기반의 스택을 사용할 수 있습니다 제안 : 어쨌든, 당신은 스택이 필요합니다.

int n; 
while (cin >> n) // this test will fail when we reach the end of the stream 
{ 
    // do something with n 
} 

이 작동 방법 :

입력 스트림의 끝에 도달

, 작업 cin >> n이 실패하면 입력 스트림의 전체 내용을 읽을 방법이있다

0

. 그러면 cin이 오류 상태가됩니다. 표현식 cin >> n에 의해 반환 된 값은 cin이고 cin (또는 다른 모든 istream 객체)이 부울 컨텍스트에서 테스트 될 때 좋은 상태에 있으면 true로, 오류 상태에 있으면 false로 평가됩니다. 따라서 위의 루프는 cin에서 cin이 입력 스트림을 모두 사용할 때 오류 상태가 될 때까지 계속 읽는 것을 의미합니다.

그래서 처음부터 얼마나 많은 숫자가 스트림에 있는지 알 필요가 없습니다. 실패 할 때까지 읽었을뿐입니다. 필요한 것은 표준 라이브러리의 컨테이너와 같이 수신 할 수있는 모든 숫자를 수용 할 수 있도록 동적으로 확장 할 수있는 데이터 구조입니다. std::stack은 청구서에 잘 어울리는 것 같지만 std::vector, std::deque 또는 std::list도 사용할 수 있습니다.

표준 라이브러리 컨테이너를 사용하지 않으려는 경우 배열을 사용하고 유효한 값의 개수를 추적 할 수 있습니다. 그렇다면 배열의 최대 크기를 결정하는 방법은 무엇입니까? 입력 스트림에 주어진 크기를 단서로 사용할 수 있습니다. 256KB는 262144 문자를 의미합니다. 각 정수 (첫 번째 정수 제외)는 적어도 2 자, 한 자리수는 1, 이전 정수와 구분되는 공백은 1을 차지해야합니다. 따라서 스트림은 최대로 262144/2 개의 정수를 포함 할 수 있습니다.

또한 입력 범위는 64 비트 정수 이상이 필요하다는 것을 나타냅니다. 현재 대부분의 시스템에서 int은이 요구 사항을 충족하지 못합니다. long long 그래도. 또는 <cstdint>을 포함하고 int64_t을 사용할 수 있습니다.