2014-12-24 3 views
0

에있는 fibonacci 숫자의 길이에 해당하는 fibonacci 차트 간격을 지정하면 n 값은 fibo 값의 라인에 공백이 있어야합니다.테이블의 C

printf("n | "); 

for (i = 1; i < = n ; i++) 
{ 
    printf("%d", i); 

    for (wert=0; wert < = (hochn(fibo(i)) - hochn(i)) ; wert++) 
    { 
     printf(" "); 
    } 
} 

다른 기능 'hochn'는 또한 'FIBO'는 피보나치 수의 값을 찾는 제

int hochn (int b) 
{ 
    int tmp; 

    for(tmp =0; b > 10 ; tmp++) 
    { 
     b = (b/10); 
    } 

    return tmp; 
} 

의 전력의 값을 찾아 낸다.

n | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
-------------------------------------------- 
f | 1 1 2 3 5 8 13 21 34 55 89 144 233 377 

이유 N = 11 돌아 다시 N = 12 2 개 공간으로 만 한 공간이 : 같은

프로그램의 실제 실행이 보인다?

+1

안녕하세요, 저에게 StackOverflow에 오신 것을 환영합니다! 대답을 찾을 수 있는지 먼저 코드를 통해 디버깅을 시도 했습니까? –

+3

'b> 10' ->'b> = 10'. '< =' -->'<=' – BLUEPIXY

+0

'putchar (" ');'대신'printf (" ");'를 사용하는 것은 유효하지만 다소 어색합니다. 출력은'hochn()'가 잘못된 대답을하기 때문에 그대로 출력됩니다. 예 :'0 : 0,1 : 0,2 : 0,3 : 0,4 : 0,5 : 0,6 : 0,7 : 0,8 : 0,9 : 0,10 : 0,11 : 1, 12 : 1, 13 : 1, 97 : 1, 98 : 1, 99 : 1, 100 : 1, 101 : 1, 102 : 1, 103 : 1, 104 : 1, 105 : 1, 106 : 1 , 107 : 1, 108 : 1, 109 : 1, 110 : 2, 111 : 2, .... 이는 0에서 120까지의 간단한 테스트를 실행하여 쉽게 볼 수 있습니다. 이를 수정하면 큰 숫자뿐만 아니라 0에서도 작동합니다. 'for (tmp = 1; (b/= 10)> 0; tmp ++); 사소한 코드를 테스트하는 방법을 배웁니다. –

답변

0

hochn() 함수가 반환 한 값을 간단히 테스트하면 잘못된 대답이 산출된다는 것을 보여줍니다. 아래 코드에서 귀하의 버전은 hochn0()입니다. 고정 버전은 hochn1()입니다. 나는 레이아웃을위한 테스트 코드도 포함시켰다. 제목 줄을 인쇄하면 전에보다는 숫자 뒤에 공백이 삽입되므로 내용이 복잡해지며 줄 끝에 공백이 생깁니다. 또한 문제가 11이 아닌 7로 시작한다는 것을 참고하십시오.

아래 코드에서 함수를 선언하기 전에 함수 선언을 요구하는 컴파일러 옵션이 있기 때문에 함수를 정적으로 만들었습니다.

#include <stdio.h> 

static int hochn0(int b) 
{ 
    int tmp; 

    for (tmp = 0; b > 10; tmp++) 
     b = (b/10); 

    return tmp; 
} 

/* hochn1() - return int(log10(b)) - 1, and 0 for b <= 0 */ 
static int hochn1(int b) 
{ 
    int tmp; 

    for (tmp = 0; (b /= 10) > 0; tmp++) 
     ; 

    return tmp; 
} 

static int fibo(int n) 
{ 
    int f0 = 0; 
    int f1 = 1; 
    for (int i = 0; i < n - 1; i++) 
    { 
     int fn = f0 + f1; 
     f0 = f1; 
     f1 = fn; 
    } 
    return f1; 
} 

int main(void) 
{ 
    for (int i = 0; i < 120; i++) 
    { 
     int h0 = hochn0(i); 
     int h1 = hochn1(i); 
     if (h0 != h1) 
      printf("%3d: hochn0 = %d, hochn1 = %d\n", i, hochn0(i), hochn1(i)); 
    } 

    int n = 14; 

    /* Broken - print spaces after number */ 
    printf("n | "); 
    for (int i = 1; i <= n; i++) 
    { 
     printf("%d", i); 
     for (int wert = 0; wert <= (hochn0(fibo(i)) - hochn0(i)); wert++) 
      putchar(' '); 
    } 
    putchar('\n'); 

    /* Fixed - print spaces before number */ 
    printf("n |"); 
    for (int i = 1; i <= n; i++) 
    { 
     for (int wert = 0; wert <= (hochn1(fibo(i)) - hochn1(i)); wert++) 
      putchar(' '); 
     printf("%d", i); 
    } 
    putchar('\n'); 

    /* Succinct fixed */ 
    int count = 0; 
    count += printf("n |"); 
    for (int i = 1; i <= n; i++) 
     count += printf("%*s%d", (hochn1(fibo(i)) - hochn1(i)) + 1, " ", i); 
    putchar('\n'); 

    for (int i = 0; i < count; i++) 
     putchar('-'); 
    putchar('\n'); 

    /* Result line */ 
    printf("f |"); 
    for (int i = 1; i <= n; i++) 
     printf(" %d", fibo(i)); 
    putchar('\n'); 

    return 0; 
} 

출력 예 :

첫 번째 섹션 및 hochn0()hochn1() 다른 답을 제조 번호를 식별한다. 마지막 몇 줄은 원본과 몇 개정의 결과물이 어떻게 나타나는지 보여줍니다.

10: hochn0 = 0, hochn1 = 1 
100: hochn0 = 1, hochn1 = 2 
101: hochn0 = 1, hochn1 = 2 
102: hochn0 = 1, hochn1 = 2 
103: hochn0 = 1, hochn1 = 2 
104: hochn0 = 1, hochn1 = 2 
105: hochn0 = 1, hochn1 = 2 
106: hochn0 = 1, hochn1 = 2 
107: hochn0 = 1, hochn1 = 2 
108: hochn0 = 1, hochn1 = 2 
109: hochn0 = 1, hochn1 = 2 
n | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
n | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
n | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
------------------------------------------ 
f | 1 1 2 3 5 8 13 21 34 55 89 144 233 377