컴공 일기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를 선물하세요.
-
일단 제 가운데 , 저의.덕코 전재산, 통장잔고 전재산, 저희 집 집문서 걸고...
-
내일부터 이틀간은 학원 들어가기 전 마지막 가족여행..!
-
요새 신체적 전성기라는게 느껴짐...(체력빼고) 얼른 사회 헬스장에서 몸을 만들어놔야겠슴뇨
-
키작귀여운 사람이랑 사귀고 싶다
-
ㄹㅇㄹㅇ
-
문학 비문학 수1 수2
-
옛날롤이그립긴해 5
요즘엔 걍 격려 몇마디 좀 했다고 정지주는거부터 말이안된다고생각함
-
살짝 지저분한가..흠..슬슬 해야겠군
-
D-250 2
수학 경우의 수 유형10(35 문제) 원순열 유형 3 (13문제) 중복순열 유형...
-
굵은 소금이 4
ㄹㅇ 짭짭하게 맛있음
-
수학 27+3마냥 킬러 몇 문제에 그 외에는 전부 쉬운 문제를 박아버리니 언매 기준...
-
엔제푸는게 내신대비에 도움이 절대안되려나
-
김범준 스블 6
뉴런 거의 다 들었는데 수2가 부족한 느낌이라 수2 김범준쌤 스블 들으려하는데...
-
지금 뭘 해야할지 모르겠습니다 스블 이때까지 들었던거 틀린문제 복습하고 계속...
-
필수구매니까 13주차 부터 번장에 풀리겠지
-
다뒤졌다 다하고잔다…
-
수학이 제일 부족한것같아서 엔제끼려고하는데 설맞이 아카이브?를 사야하는거임 아니면...
-
세젤쉬 다음 2
세젤쉬와 미친기분 시작편을 다 끝냈는데 다음에 쎈을 푸는게 나을까요 아니면 바로...
-
이거 두개 하는거 현실에서 걸리면 나락감 대학 초기에 다 친해질때 하다 걸리면 진짜 친구 0명됨
-
맘껏 갖고 놀수 있음
와 님 오랜만
ㄷㄷ
빅 인티저 문제 맞나 이게
이야 이거 1학년 자료구조 과제였는데