2016-08-27 3 views
-1

정수 k이 주어지면 소수부 k까지 잘린 103993/33102의 값을 찾을 것으로 예상됩니다. 그래서 내 방식이었다 다음소수 자릿수 k로 잘린 소수점 찾기

int k ; 
    scanf("%d",&k); 
    printf("3"); 
    if(k>0) 
    printf("."); 
    long long int num=30; 
    long long int numer = 1039930; 
    long long int denom = 33102; 
    while(k--) 
    { 
     long long int bro = numer/denom; 
     printf("%lld",bro-num); 
     num=bro; 
     num*=10; 
     numer*=10; 
    } 

그러나 k 경우 20이 이상한 대답을 보여주고있다 .... 루프에 문제가?
http://ideone.com/dndib2

+0

@OliverCharlesworth .... 데이터 타입이'long long'이고'20'보다 작은 숫자에 대한 답이 맞습니다. 그래서 루프의 가능한 오류를 알아낼 수 없습니다 ....; ( – yobro97

+0

@ yobro97 아니요, 코드가 정확한 대답을 제공하지 않습니다. 먼저 디버그하십시오. – jbsu32

+0

k에 대한 제약 조건은 무엇입니까? –

답변

1

문제는 오버 플로우입니다. 20 회 반복 루프에서 num *= 10;numer *= 10;

는 어느 것이 적다^20 10은 18,446,744,073,709,551,615 (2^64-1)의 최대 값을 저장할 수 (10 (20)의 전원)과 long long int되는 64 비트 수단 10^20보다.

5

위에서 설명한대로 long long int은 넘쳐 흐르고 있습니다. 이것은 단순한 단락으로 나눌 수있는 비슷한 방법을 보여 주며, 심지어 그것을 계산하기 위해 long long int이 필요하지 않으며, 매직 넘버로 "수정"하려고하지 않습니다.

#include <stdio.h> 

int main (void) { 
    int places = 20; 
    int numer = 103993; 
    int denom = 33102; 
    int quot; 
    int i; 

    // integral part 
    quot = numer/denom; 
    printf("%d.", quot); 
    numer -= denom * quot; 

    // fractional part 
    for(i=0; i<places; i++) { 
     numer *= 10; 
     quot = numer/denom; 
     printf("%d", quot); 
     numer -= denom * quot; 
    } 
    printf("\n"); 
    return 0; 
} 

프로그램 출력 :

3.14159265301190260407 

편집 : 소수점 수에 대한 유일한 제한은 루프 제어 변수의 크기이다. 원한다면 같은 코드가 큰 숫자 소수점 이하 자릿수를 인쇄합니다.