컴공 일기275
게시글 주소: https://orbi.kr/00072352394

교수가 꽤 재미있는 과제를 냈습니다. 피버나치 수열의 1000번째 값을 구하고 싶은데, 보다시피 자리수만 따져 보더라도 200자리가 훌쩍 넘어갑니다. 파이썬은 고민할 필요가 없겠습니다만 C언어에서는 200자리가 넘어가는 정수형을 담을 수 있는 기본 자료형이 존재하지 않습니다. 기껏해야 long long일텐데, 이 마저도 200자리는 커버할 수 없지요.
물론, 라이브러리를 이용하면 이 정도 문제야 간단히 해결할 수 있습니다만
바보가 아닌 교수는 라이브러리를 사용하지 않고, 적합한 코딩을 통해 200자리를 담아낼 수 있는 코드를 작성하라고 하는 겁니다.
방법은 간단합니다. 그냥 합치는 거죠. 기본 타입으로는 200비트를 커버할 수 없으므로, char형 200사이즈 되는 배열 두 개를 만들고,
피버나치 점화식을 돌리면서 이 배열들을 업데이트해주면 됩니다. 기본 정수형이 200비트에 모자라서 생긴 일이니, 충분히 커버할 수 있는 array 자료구조를 이용하면 되는 겁니다.
#include <stdio.h>
#include <string.h>
#define N 209 //The 1000th Fibonacci number has 209 decimal digits.
void print_digits(char d[N])
{
int i = 0;
while(d[i] == 0) i++;
while(i<N)
{
printf("%d", d[i++]);
}
}
void add_digits(char aa[N], char bb[N])
{
int i = 0;
int carry = 0;
int j,s;
while(aa[i] == 0) i++;
for(j=N-1; j>=i-1; j--)
{
if( ( s = carry + aa[j] + bb[j]) > 9)
{
carry = 1;
bb[j] = s-10;
}
else
{
bb[j] = s;
carry = 0;
}
}
}
int main()
{
char aa[N] = {0};
char bb[N] = {0};
char tmp[N] = {0};
bb[N-1] = 1;
for(int i=2; i<=1000; i++)
{
memcpy(tmp, bb, sizeof(bb)); //save bb
add_digits(aa, bb); //update bb
memcpy(aa, tmp, sizeof(tmp)); //update aa
}
print_digits(bb);
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
왜이렇게 많지 했더니 지금 이벤트 중이었음 ㅅㅂ ㅜㅜㅜㅜㅜㅜ
-
행렬 문제 0
정사각 행렬 A를 주고 A^n = E(단위행렬)를 만족시키는 자연수 n의 최솟값을...
-
역학이 정확이 어디까진데
-
국어 시간은 수특 수업 하는데 이건 연계 학습에 도움에 될 거 같아서 듣고.. 사탐...
-
1은 나오고 이제 막 기출다돌림 적백 목표로 하고있습니다 4규 -> 드릴6 ->...
-
나 빼고 다 노베 아닌 거 같은데 ;;
-
수2 질문 6
함수 극한에 관한 성질에서 f(x)+1/g(x)일때 분모->0일때 분자->0인 경우...
-
현우진 과거 1
어그로 ㅈㅅ 잗년 생윤+사문 선택자였는데 각각 3,5뜸 작수생윤이 윤사틱하게 나와서...
-
재밌을거같음
-
작년 지구는 백분위 94뜨긴했음 3월에 공부 시작해서 이제 수특 다끝냈는데...
-
흐흐흐
-
이감 오프가 그정도야??
-
선넘질 받아요 2
욕해주세요..@@@
-
ㅋㅋㅋㅋ
-
메이지 하지 마셈뇨
-
밥먹어야대는데 0
아 배고픈데
-
방학때는 이렇게 하면 정시도 되겠는데? 하고 새기분 돌리고 브크해볼까? 했는데...
-
마크 ㅇㅈ 6
던전 하나 짓는중 하늘 이ㅃ네
-
한전, 4년만에 흑자전환…지난해 영업이익 8조3천억원 4
한국전력이 지난해 8조원대 영업이익을 내며 4년 만에 적자 수렁에서 벗어났습니다....
-
국내에서 하도 짱깨 어쩌고 드립쳐서 그렇지 전세계 영향력 있는 AI 연구자들 중...
와 님 오랜만
ㄷㄷ
빅 인티저 문제 맞나 이게
이야 이거 1학년 자료구조 과제였는데