寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語による植木算

C言語による植木算のプログラムです。
Xcode上で、動作を確認しました。
植木算は、ウィキペディアから引用すれば、算数の文章題、またその解き方の一種です。
植木算 - Wikipedia
木を植える間隔や、植える木の本数、並木の長さなどを求める問題ですが、問題が「木」でないこともよくあります。
例としては、電柱や旗、それに人などが立ち並びます。
出題内容を大きく分けると、植木が直線上なのか、それとも環状なのか。
そして公式としては、以下の3パターンがあります。
・一直線上に立っていて、両端にもある場合:木の本数=木の間の数+1
・一直線上に立っていて、両端にない場合:木の本数=木の間の数-1
・円などの周りに立っている場合:木の本数=木の間の数
そのため本プログラムにおいては、3つの選択肢を用意しました。
全体の距離と間隔の長さを入力することで、間隔の数を計算し、それぞれの場合の植木の数を求められます。
結果表示後に、もう一度計算し直す場合は継続し、そうでなければ終了します。

/*
 C言語による植木算
 https://neguse-atama.hatenablog.com
*/
#include <stdio.h>
int main(void){
    int bangou,honsuu,kankazu,zenkyori,kannaga,tuzuki;
    do{
        printf("植木算を計算します。\n");
        printf("全体の距離と間隔の長さを入力してください。\n全体の距離:");  scanf("%d",&zenkyori);
        printf("間隔の長さ:");  scanf("%d",&kannaga);
        printf("1.両端に木を植える場合\n2.両端に木を植えない場合\n3.円形に木を植える場合\n");
        printf("以上から1,2,3のいずれかを選び、入力してください:");  scanf("%d",&bangou);
        kankazu=zenkyori/kannaga;
        if(bangou==1){
            honsuu=kankazu+1;
            printf("求める植木の数は%dです。\n",honsuu);
        }else if(bangou==2){
            honsuu=kankazu-1;
            printf("求める植木の数は%dです。\n",honsuu);
        }else if(bangou==3){
            honsuu=kankazu;
            printf("求める植木の数は%dです。\n",honsuu);
        }else{
            printf("1,2,3以外の数を入力しないでください。\n");
        }
        printf("計算をやり直しますか。・・・(0)はい (1)いいえ:");
        scanf("%d",&tuzuki);
    }while(tuzuki==0);
    return (0);
}

中学の入試問題や進学塾などで出題される特殊算の中から、植木算について考えてみました。
文章題としての出題になりますが、解法は簡単で、要するに1を加えるべきか、あるいは、引くべきかのいずれかになります。
ただし円形、環状であれば、植木の数と間隔の数が等しくなるから、操作はしません。
したがって出題する側の意図としては、おそらく読解力や注意力などを求めているのでしょう。
ゆえに、普通は自明かつ数え上げ問題としても考えられます。
発展としては、数学らしく抽象化された平面植木算、空間植木算と言う、広義の植木算などがあります。

ところで僕が小さかった頃に、「ハトとハトの巣」と言う絵本を読みました。
「算数絵本・考え方の練習帳」と言うシリーズの一冊です。
その絵本の中では、鳩の巣原理をはじめ部屋割り論法などについて、易しく説明してくれていました。
例えば、10羽の鳩が、9つの巣の中にいるならば、少なくとも1つの巣には2羽以上の鳩がいる。
と言った内容だったように、なんとなく記憶しているのですが、もちろんこれも自明な数え上げ問題だと言えます。
とても大好きな絵本でした。