#include <stdio.h>
#define MAX 1000
// 0번째 칸에는 자리수를 저장합니다. 만진법을 사용합니다.
// 1번째 칸에는 일의 자리, 2번째 칸에는 만의 자리, 3번째 칸에는 억의 자리
// ... 등을 저장합니다. 최대 3996자리까지 출력이 가능합니다.
void printResult(int []);
void copy(int a[], int b[]) {
int i, n=a[0];
for(i=0;i<MAX;i+=1) { b[i]=a[i]; }
}
void clear(int a[]) {
int i;
for(i=0;i<MAX;i+=1) { a[i]=0; }
a[0]=1;
}
void add(int a[], int b[], int r[]) {
int i, j, x=0;
clear(r);
r[0]=a[0];
if(b[0]>r[0]) { r[0]=b[0]; }
for(i=1;i<=r[0];i+=1) { // 수의 각 자리와 밑에서 올라온 수를
x=a[i]+b[i]+x; // 더해줍니다.
r[i]=x%10000; // 값이 9999보다 크면 제자리의 수만 남고
x=x/10000; // 윗자리로 올라갑니다.
}
if(x!=0) {
r[0]+=1;
r[r[0]]=x;
}
}
// 출력은 다시 큰 수 부터 출력해 준다.
void printResult(int result[]) {
int i, x;
x=result[0];
printf("%d", result[x]);
for(i=1;i<x;i+=1) {
printf("%04d", result[x-i]);
}
printf("\n");
}
int main() {
int a[MAX]={1,0,}; // 0을 나타냅니다.
int b[MAX]={1,0,}; // 0을 나타냅니다.
int c[MAX]={1,1,}; // 1을 나타냅니다.
int i, n;
printf("n= "); // 몇번째 피보나치 수열까지 출력할지 입력합니다.
scanf("%d", &n);
for(i=0;i<n;i+=1) {
copy(b, a); // b값을 a에 복사합니다.
copy(c, b); // c값을 b에 복사합니다.
add(a, b, c); // a, b를 더해서 c에 넣습니다.
printf("%3d ", i+1); // 몇번째 피보나치 수열인지 표시합니다.
printResult(b); // 피보나치 수열을 출력합니다.
}
return 0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
두수의 비교 (0) | 2013.09.13 |
---|---|
Cramer공식을 이용한 연립방정식풀기 (0) | 2013.09.13 |
어셈블리 리스팅 보기 vc++과 gcc(MinGW)의 경우 (0) | 2013.09.12 |
if문 없이 성적처리하기. (0) | 2013.09.10 |
단어세기 (0) | 2013.08.21 |