2014-03-05 3 views
0

여기 Spoj 문제 ROOTCIPH입니다. C에서 두 가지 방법으로 문제를 해결했습니다. 하나의 접근 방식은 정답과 다른 오류를 제공합니다.Spoj ROOTCIPH 틀린 대답

우리는 문제를 해결하는 방법을 논의하지 않을 것입니다. 해결책은 간단합니다. 항상 * a -2 * b입니다. (입방 방정식의 뿌리의 기간으로 생각하십시오.) 어쨌든 질문은 그것과 관련이 없습니다. 내가 제공 한 세부 정보로 소스에 대한 솔루션을 실행하고 더 많은 것을 분석 할 수 있습니다.

이제 질문 : 코드에서

아래 대신 'INT'의 경우, 내가 오래 오래, 내 대답은 그렇지가 틀렸다는 주심의 '내부'에 대한 올바른 표시됩니다 걸릴의 printf에서 %의 LLD를 촬영 한 , 따라서 정수를 초과하면 처리해야합니다.

잘못된 코드 :

int main() 
{ 
    int a,b,c; 
    int t; 

    scanf("%d",&t); 

    while(t--) 
    { 
     scanf("%d%d%d",&a,&b,&c); 
     printf("%lld\n",1LL*a*a-2*1LL*b); 
    } 

    return 0; 
} 

오른쪽 코드 : (A)의 절대 값이, B, C^8 (10)를 초과하지 않을 것이라는

int main() 
{ 
    long long a,b,c; 
    int t; 

    scanf("%d",&t); 

    while(t--) 
    { 
     scanf("%lld%lld%lld",&a,&b,&c); 
     printf("%lld\n",a*a-2*b); 
    } 

    return 0; 
} 

참고.

첫 번째 접근 방법이 잘못된 해결책을 제공합니까? 주어진 링크에서 솔루션을 실행하고 확인하십시오.

C operator precedence table에 따르면, *은 왼쪽에서 오른쪽으로 연결됩니다.

+0

'long'에 맞는'int '에 맞지 않는 매우 큰 숫자가있을 수 있습니까? – Brian

+0

1LL을 사용 했으므로 우선 순위에 따라 결과가 항상 길어야합니다. –

+1

결과는 'long long'입니다. 중간 값 유형 (특히 a * a)에 대해서는 아무 것도 말하지 않습니다. –

답변

1

@GIJoe가 제시 한대로 int보다 큰 숫자를 저장할 수있는 long long을 사용하면 차이가있을 수 있습니다. 예를 들어, 표현식의 일부는 a*a입니다. 1LL으로 곱하면 효과가 변환되어 이미 손상되었을 수 있습니다.

+0

그러나 '1LL'에 의한 곱셈은 곱셈 'a * a'전에 발생합니다. – interjay

+0

그냥 넣기 때문에 (반드시) 실행 순서가 강제되지는 않습니다. 컴파일러는 영리한 짐승입니다 ... –

+0

명령을 시행합니다. 컴파일러는 순서를 지정하는 표준을 따라야합니다. – interjay

0

답변이 [-2 147 483 648; 2 147 483 647]이면 32 비트 (또는 16 비트 시스템 인 경우 16, 즉 [-32 768; 32 767])에 저장되는 int에 맞지 않습니다.

long long 정수는 시스템에 관계없이 64 비트에 저장됩니다.

+0

약 16 비트를 지적하기 위해 +1. 주 : long long 정수는 최소 64 비트에 저장됩니다. – chux