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
안녕하세요, 저에게 StackOverflow에 오신 것을 환영합니다! 대답을 찾을 수 있는지 먼저 코드를 통해 디버깅을 시도 했습니까? –
'b> 10' ->'b> = 10'. '< =' -->'<=' – BLUEPIXY
'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 ++); 사소한 코드를 테스트하는 방법을 배웁니다. –