C言語プログラミング 9/19

記事
IT・テクノロジー
今回は、昨日の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;
}

一応、メモ化(一度計算した結果を保存しておく)はやってます。それ以外は特に取り上げることはないですね。


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す