今回は、昨日のgets置き換え関数を使いながらトリボナッチ数列(直前3項の和で生成される数列)のプログラムを実装しました。
//tribonacci.h
#ifndef _TRIBONACCI_H_
#define _TRIBONACCI_H_
//プロトタイプ宣言
long long int tri_calc(int, long long int[]);
long long int tri(int);
#endif // _TRIBONACCI_H
//tribonacci.c
#include <stdio.h>
#include <stdlib.h>
#include "tribonacci.h"
#define none -1
long long int tri_calc(int n, long long int T[]){
if( T[n] != none ){
//T[n]は計算済み
}
else if( (n == 0) || (n == 1) ){
T[n] = 0;
}
else if ( n == 2 ){
T[n] = 1;
}
else{
T[n] = tri_calc(n-1,T) + tri_calc(n-2,T) + tri_calc(n-3,T);
}
return T[n];
}
long long int tri(int N){
long long int *T,ret;
int i;
T = (long long int *)malloc( sizeof(long long int) * N + 1 );
if (T == NULL){
printf("cannot allocate memory.\n");
exit(1);
}
for(i=0;i<N+1;i++){
T[i] = none; //メモ配列初期化
}
ret = tri_calc(N, T);
free(T);
return ret;
}
//main.c
#include <stdio.h>
#include "getsrpl.h"
#include "tribonacci.h"
int main(void){
char buf[255];
int value;
int ret;
while(1){
printf("input value:");
getsrpl(buf, sizeof(buf)); //gets置き換え
ret = sscanf(buf, "%d", &value);
if( ret == 0 ){ //ret:変換出来た数
printf("fin...\n");
break; //数字以外で終了
}
else if( 0 > value ){ //負数は認めない
printf("invalid value.\n");
}
else{
printf("T[%d] = %lld\n", value, tri(value) ) ;
}
}
return 0;
}
一応、メモ化(一度計算した結果を保存しておく)はやってます。それ以外は特に取り上げることはないですね。