ブログトップ

電子工作やってみたよ

円周率(パイ π)はいろいろな事で人々を楽しませていますね。
もちろん楽しむ為に存在しているのではなく学問や土木、工業などあらゆる方面で役に立っているわけですけど。
円周率の楽しみ方のなかで一番人気があるのは、いかに多くの数字を記憶するかということでしょうか。
日本人で10万桁も覚えたひとがいるそうですね。
私も中学生のとき友達と何桁まで覚えられるか競争したことがあります。
勉強へのやる気はなかなか起きないのに、こういう事にはやたら一生懸命になれるんですね。
そしてこのように遊びながら本気でやったことはいつまでも覚えていられるようです。
いま紙に書きながらテストしたら26桁出来ました。(3. 14159 26535 89793 23846 26433)
なのに 昨日言われたことはすぐ忘れてしまうのですよ。 これはなんなのでしょうか。
今までの人生でこの円周率覚えていたことで役立ったことないですね。
だからと言って ゆとり世代の「円周率は3」というのはどうだかなーと思いますが。

もう一つ円周率の楽しみは、いかにして計算するかですね。
ネットで調べたら10種類くらいありそうです。
その中で 一番電卓向きと思われる モンテカルロ法をHP電卓を使ってやってみます。
HP32S を使いました。  最近はこればかりになっちゃいました。

c0335218_18194215.jpg


モンテカルロ法をやるには まず乱数の発生のばらつきが均一でなければ正しい測定はできないのでまず乱数を計ってみます。


全プログラムリスト 

A01 LBL A **************************
A02 123.4567  乱数発生器の初期値 何でもよい
A03 SEED    乱数初期値セット
A04 CR VARS  すべての変数をゼロにする

B01 LBL B **************************
B02 RANDOM  乱数の発生 0 ~ 1まで
B03 10     I 乱数を10倍して 0~10までとする
B04 X I
B05 1      乱数に1を足して 0,1,2, を 1,2,3,とする
B06 +
B07 STO i   乱数データが配列のポインターとしてセットされる(少数部分に何かあっても整数部分のみ自動的にポインターになる)
B08 1
B09 STO (i)  発生した乱数に対応する変数を一つ加算する 0~1の時はAが+1 1~2の時はBが+1 2~3の時はCが+1
B10 GTO B


出力されたデータ (30分間測定)
変数名  データー範囲   出力回数
 A     0~1     3920
 B     1~2     3913
 C     2~3     4075
 D     3~4     3937
 E     4~5     3937
 F     5~6     3965
 G     6~7     3925
 H     7~8     4007
 I     8~9      4017
 J     9~10     3983

最大値  4075
最小値  3913
差    162

生データの合計  39677 
データの平均値  39677 / 10 = 3967.7
差 / 平均値   162 / 3867.7 = 0.040829
乱数の発生頻度のバラツキ  4.08%

ばらつき 4% こんなものでしょうか。

最初測定1分間でデータの数150個でやりましたが ばらつきが16%にもなったので 30分間やり直しました。

これで終わりです。




乱数の発生のばらつきはほどほどに働いているので 次 モンテカルロ法でやってみます。
これは x,y 二つの値を乱数でだして座標としそれが円の内部にあるか外部なのかで円周率を求めるものです。 

全プログラムリスト 


C01 LBL C **************************
C02 123.4567  乱数発生器の初期値 何でもよい
C03 SEED    乱数初期値セット
C04 CR VARS  すべての変数をゼロにする

D01 LBL D **************************
D02 1
D03 STO +C  全体の回数 カウントアップ
D04 RANDOM  乱数作成 X
D05 X^2    2乗してaにしまう
D06 STO A
D07 RANDOM  乱数作成 Y
D08 X^2    2乗する
D09 RCL A
D10 +     乱数のXとYを足す
D11 1     乱数を2乗して足したものが1を超えたか
D12 X < Y ?
D13 GTO D   超えていたらデータ無視して次の乱数の計算に入る。
D14 1
D15 STO +D  1以内ならばDをカウントアップする
D16 GTO D   次の乱数の計算に戻る


測定は30分間やりました。
変数名  データー
 A    Xのランダム数
 B    未使用
 C    全体のポイントの回数    30分ごのデータ  23999
 D    1以下のポイントの回数   30分ごのデータ  18861

円周率  ( 18861 X 4 ) / 23999 = 3.14363098   すごい  これ 嘘じゃないの?

誤差の計算  (測定値 ー  真の円周率 )/ 真の円周率
誤差の計算  (3.14363098 - 3.14159265) / 3.14159265 = 0.00064882

これで終わりです。


計算した円周率 3.14363098   
誤差      0.064%

乱数のばらつきが4%あるのに最終誤差がどうしてこんなに減るのだろう。
モンテカルロ法 こんなので精度は出るはずないと思っていたのだけれど。
測定誤差か 計算ミスか  これが正しければ モンテカルロ法ってすごいんだ。 

HP32Sの乱数発生は品質いいみたい。 これソフトで同等の精度のものを作ろうとしたら、結構大変じゃないかな。
配列データの関節指定 ( i ) はうまく使うとコンパクトで解りやすいですね。これ IF文 でやったら、ぐちゃぐちゃになりそう。
HP電卓でプログラムを組むのは もうゲームですね。 役立つかどうかは二の次。

この次は 10種ほどあるという 円周率の計算 別のものでやって見ます。


追記
再現性があるか確認するために次の日(2017年11月1日)に乱数の種データを変えてモンテカルロ法(同じソフト)でやってみました。

乱数の種データ  2.718281828
電卓のRUN時間  30分 (HP32Sにて)
結果       C = 全体のポイントの回数 23734
  D =1以下のポイントの回数 18638

円周率  ( 18638 X 4 ) / 23734 = 3.141147721

誤差の計算  (測定値 ー  真の円周率 )/ 真の円周率
誤差の計算  ( 3.141147721 - 3.14159265) / 3.14159265 = 0.000141627

計算した円周率 3.141147721   
誤差      0.01416%

再現性はいいですね。 しかし気分はデータ良すぎて納得できないな。


これ 次回ブログ作るときの参考の枠です。 関係ないけどここに置きます。

全プログラムリスト 

これで終わりです。



by telmic-gunma | 2017-10-31 22:06 | HP電卓 | Trackback | Comments(4)

この式 オイラーの等式と呼ばれ数学の式のなかでも最も美しい式の一つだそうです。
わたしは、このシンプルな式の美しさなんとか解りますが この式がどのように導かれたのか、また何の役に立つのか皆目わかりません。
この式 以前ブログに載せた 小川洋子さんの「博士の愛した数式」の中に出てきましたね。

天邪鬼な私としては、この式をHP電卓で計算して成り立つのかいなかを見たいと思いました。
電卓のマニュアルや数学の本、ネットなど、一週間ほど調べてみました。

c0335218_12334551.jpg





調べて解ったことは 次の展開された式の Θ (シータ)が π (パイ)の時になりたつということです。
直接 オイラーの等式を電卓に入力して答えを出す方法は解りませんでした。

c0335218_12335367.jpg
このΘ(シータ)にπ(パイ)を代入すれば cosπ(パイ)は -1 となり sinπ(パイ)はゼロとなりますから電卓の出番もなく
-1 +1でゼロとなりこの式は合っているとなります。

HP電卓でなく 最近の「数式通り」の電卓ならば答えが出るのでしょうか。
ぜひ トライしてみたいですね。


これで終わりでは寂しいのでこの e (ネイピア数)を導く式をHP電卓で計算してみます。

c0335218_12373178.jpg
Xが1の時に e の値になりますので、Xのところはすべて1になって計算は単純になりますね。



全プログラムリスト (HP32S を使用)

変数名
A:   右辺 分母の数値  0, 1, 2, ~ 一つづつ増加する
B: e の積算値


A01 LBL A   *******

A02 0
A03 STO A   右辺 分母の数値  0, 1, 2, ~ 一つづつ増加する
A04 STO B    e の積算値

B01 LBL B   *******
B02 X !     右辺 分母の階乗計算
B03 1/X     右辺 分数計算 
B04 STO +B  右辺 e の積算
B05 1      
B06 STO +A   右辺 現在の桁位置加算  
B07 15     右辺 計算終了させる桁位置の数値     
B08 RCL A   現在の桁位置
B09 X < Y ?   終了位置まで行ったか
B10 GTO B   終了位置前なので次の桁での計算をする
B11 RCL B e の積算値を読み出す
B12 STOP 


これで終わりです。


答えは1秒で出ます。

2.71828182846 なので正解ですね。 演算の繰り返しは15より小さくしてもいいですね。



c0335218_21395957.jpg

庭に咲いているとは言えないかもしれませんが、真っ赤になった「ほおづき」です。
ピントがちょっと合っていませんけれど。
葉っぱはもう枯れています。


c0335218_21394858.jpg



by telmic-gunma | 2017-10-29 20:43 | HP電卓 | Trackback | Comments(2)

「バイクパッキング入門」 田村浩著 が出版されました。
これは いままでの「自転車キャンピング」と言われていた方法をガラっと変えて超軽量の装備で自転車キャンプをしようというものです。
いままで キャンピング車というと頑丈なフレームに大きなキャリアを付け太いタイヤを履いた重たい自転車ということになっていました。
それが 重たいキャリアなど付けずにバッグだけに必要な物を積んで軽量なロードバイク(自転車)でキャンプをするわけです。
当然 キャンプの装備などすべてのものを超軽量なものにしていますね。
わたしも これにならってぜひやって見たいですね。

c0335218_22231078.jpg

着替えから寝袋、マット、テント、炊事道具やコンロなどすべて入っています。
山登りの方で、ウルトラライトキャンピングという超軽量な装備でやる方法がありますが、それの自転車版が始まったということですね。

c0335218_22232481.jpg

この写真を見ると ただのサイクリングという感じですよね。 キャンプ道具を積んでいるとはとても見えません。
c0335218_22233871.jpg

これは 4年前 私が埼玉県の堂平にある東京天文台のキャンプ場に仲間と行ったときの写真です。
超重戦車という感じ。  テントも寝袋も寝るときに敷くシートもどでかいですね。
自転車後部がべらぼうに重かったです。
この時 坂道でスピードがでるとハンドルがふらついて、かなり危険な思いをしました。
キャンピング用の頑丈な自転車のはずなのになぜだろうと思っていました。
この田村さんの本には、このことに関して説明があり 自転車の重心から離れたところ重いものがあるとハンドルがとられて危険な状態になるということでした。
この知識を得ただけでも本代金の元は取れたとおもいます。
早く バイクパッキングの準備をしてキャンプ出かけたいですね。

c0335218_21343863.jpg


by telmic-gunma | 2017-10-25 23:26 | サイクリング | Trackback | Comments(0)

プログラムコンテストとは関係ないけど、kusakaさんが送ってきたプログラムです。

以下 kusaka さんのプログラム  3時休みの10分間で作ってしまったそうです。
若いですね、うらやましいなー

***********************

1~1000までの素数を見つけて合計するっていうのはどうですか?簡単かな

三時休みでできちゃった。難しい問題ないかなー

全プログラムリスト 

number of prime = 169
sum of prime = 76128
#include <stdio.h>

void main()
{
    int i;
    int a;
    int num_ans = 0;
    int sum_ans = 0;
    int prime = 0;
    for(i = 1; i <= 1000; i++){
        prime = 1;
        for(a = 2; a < i; a++){
            if(i % a == 0)
                prime = 0;
        }
        if(prime){
            printf("%d\r\n", i);
            num_ans++;
            sum_ans += i;
        }
    }
    printf("number of prime = %d\r\n", num_ans);
    printf("sum of prime = %d\r\n", sum_ans);
}


これで終わりです。

kusakaさんのC言語 シンプルですね。


c0335218_13073923.jpg

以下わたしが HP32S で組んだものです。
私の答えは 
素数の数   168
素数の加算値 76127

kusakaさんの値より、なぜかどちらも 1つ小さいです。
演算時間は丁度30分かかりました。
えーと ソフトを作った時間は、ないしょ
フローチャートなど事前に作らないとソフトを組むことできないですね。

全プログラムリスト (HP32S を使用)

変数名
A:   調査する数      初期値1として+2づつ増やし 奇数のみ調査する。
B: 調査する数を割る数  初期値1として+2づつ増やす、奇数でのみ調査する。
C: 素数を加算した合計  最初の素数2は初期値として置いておく
D: 素数の累積の数    1を最初とする。(素数2を置いてあるから)



A01 LBL A   *******

A02 3
A03 STO A   調査する数 素数2は既知とし3から調べる
A04 STO B   調査する数を割る数
A05 2
A06 STO C   素数を加算した合計 最初の2のみ手で入れておく
A07 1
A08 STO D   素数

B01 LBL B   *******
B02 RCL A   調査する数
B03 RCL B   調査する数を割る数
B04 X=Y
B05 GTO F   値が一致していれば素数なので G へ行く

C01 LBL C   *******
C02 ÷     調査する数を順次割って割り切れるかチェックする
C03 FP   (少数以下を取り出す)
C04 X=0
C05 GTO G   少数以下ゼロ、(り切れた)なら素数ではないので次の数値を調べに行く
C06 2
C07 STO +B  割る数を2増やしてチェックし直す 
C08 GTO B

F01 LBL F   ********
F02 RCL A   素数だったので今の値を素数の積算値の足す
F03 STO +C
F04 1
F05 STO +D  素数だったのでカウンターに1を足す 

G01 LBL G   *******
G02 3
G03 STO B   割る数を出発点の3に戻す
G04 2
G05 STO +A  調べる数を2増やす。
G06 1000   上限値の1000
G07 RCL A   調べる数を読み込む
G08 X>Y    調べる数が上限値を越えたか調べる
G09 GTO H   上限値を越えたのでHへ行く
G10 GTO B   まだ上限値でないのでさらにチェックを続ける

H01 LBL H   *******
H02 RCL C   素数積算値を表示する
H03 STOP   停止して終わり

これで終わりです。



C言語だとフローチャートなどなくてもリストだけで全体の動きが見られますね。
これ 図形としてプログラムの形も表現されているからでしょうか。

HP電卓の方は、コメントがあったとしても、一つづつの動作を追っていかなければ理解が難しいですね。
ましてや コメントのないリストは知恵の輪を解くようなものですか。 
これが 結構楽しいのですけけれどね。


追記
プログラムを作っていて頭が混乱してきたのでフローチャートを作りました。
これ 最初にやるべきでしたね。

c0335218_20210497.jpg

素数かいなか調査するときの数値を追って考えました。
この絵を書いたことにより頭がスッキリしました。
やはり絵で表現すると脳が理解しやすいのでしょうか。


c0335218_20213508.jpg

上の続きです。


c0335218_20221011.jpg


by telmic-gunma | 2017-10-23 14:56 | HP電卓 | Trackback | Comments(4)

久しぶりに映画を見に行ってきました。
「ドリーム」というアメリカ映画です。
1961年 まだ人種差別の激しかったころのアメリカのNASAでのはなしです。
ロケットで人間を宇宙に送り出すための軌道計算をする黒人女性たちの物語。
(実在の人の話だそうです。)
コンピューターが出来る前で、計算係の女性の机に機械式の電動計算機がドカンと置いてありましたね。
計算尺は出てきませんでした。当時の実写の写真では女性が計算尺を持っている姿が写っていたのに。
それからほぼ10年後の1970年でしたか、アポロ13号が月に行くときに事故を起こしたときの実写でも コントロールルームの中で計算尺を持って悩んでいる人が写っていました。
映画になるとそういうのが消えちゃうのでしょうか。

マーキュリー計画とかフレンドシップセブンとか懐かしい言葉が出てきました。
ソ連のガガーリン少佐がアメリカより早く宇宙飛行に成功したので、アメリカは焦ってやっていたのですね。
その先を越された時の計算センターの所長の言葉が印象的。

これからは残業続きになる。
その見返りは無い。
ついてこれない人は、今までの働きに感謝する。
( クビにするのに こういう言い回しがあるんだ。)

そく思いました。
わたしの知っている会社も昔はこうだったな。
いまは、法令順守がうるさいほどですけれど。


子供3人もいるおばさんが、シャカシャカ数式作っちゃうからすごい。

c0335218_20371774.png

これが机の上に置いてあるやつ。
これって加減乗除しか出来ないのじゃないのかな。

c0335218_20374127.png

やがてIBMのコンピュータが入るが、なかなか使いこなせない
c0335218_20375861.png

打ち上げ近くになり コンピューターの出す値が昨日と今日で違うと騒ぎになり、また人間が計算しなおして人間の方が信頼できるということやってました。
ここのところは、作り話でしょうけれど、わたしも同じような事してました。
普通の関数電卓(SIN、COSなどはあるけれどプログラムはくめない)が世間に出てきたのは、1970年代の初めでしょうか。
HP電卓はまだ知らなかったですね。カシオだけでなくソニー、松下などほとんどメーカーが出していました。
私はサンヨー電気のものをかいました。
SINを一つ出すだけでも数秒かかっていたとおもいます。
最初は電卓の出した答えが信じられなくて、必ず紙の上で計算のし直しして「あっている」なんてやってました。
毎回 電卓と手計算の二つをやっていた訳ですね。 
いまでは 考えられないことでしょうが。



庭に咲いている花もなくなりました。 名前解らないけれど 直径5cmほどの花です。
c0335218_21380441.jpg





by telmic-gunma | 2017-10-17 21:47 | いい映画 | Trackback | Comments(2)

ディスコのプログラムコンテストをネットで見たら 問題はチラシ広告だけでなくネット上にも在り合計3問出ていたのですね。
3問目は文字列を扱うので電卓では無理だけど2問目はできそうなので挑戦してみることに。


c0335218_13073923.jpg

2問目
1~1000までの間で3と5の両方で割り切れる数の
20番目と40番目と60番目の合計は?

3問目
次の300 個の名字の文字列の中で、
3 番目に多いアルファベットとその数は?
解答は「アルファベット」「数」を
カンマで区切り、記入ください。
( この後 ダウンロードするクリックがある これは HP電卓ではできません )

2問目の解き方を考えるため電卓いろいろいじっていたらプログラムを組むまでもなく答え 1800が出てきてしまった。
ここで用事頼まれて用足しして戻ってきたらメールが来ており kusakaさんは2問目も3問目もプログラムで解けたということです。
こちら もうやる気無くしていたのですが後から答えの1800が出るプログラム作ることに。
こんなの たしか大昔に読んだ星新一のショートショートにあったですね。
人間がプログラム作らずに神様の御利益を受け取っていたけれど、後になって神様は人間に「プログラムを作らないと滅ぼすよ」と言ってきて
人間は必死にプログラムを作るというような話だったかなー

2問目  kusakaさんのソフト
***********************************************

前回のでなれたから5分で出来ました。

答え1800

3問目はあまり扱わない配列、文字列なので手こずりましたが

30~40分で出来ました。


2問目 全プログラムリスト    kusakaさん作

#include <stdio.h>

void main()

{

    int ans = 0;

    int i;

    int c = 0;

    for(i = 1; i <= 1000; i++){

        if(i % 3 == 0 && i % 5 == 0){

            c++;

            if( c == 20 || c == 40 || c == 60){

                 printf("find\r\n");

                ans = ans + i;

            }

        }

    }

    printf("ans = %d\r\n", ans);

}


***********************************************************
以下はわたしの HP32Sii RPNでのソフトです。

2問目 使用されている変数 A,E,F

A01 LBL A
A02 0
A03 STO A    現在実行中の数 1~1000
A04 STO E 5と3で割れた回数
A05 STO F    20,40,60の時の数を加算したもの

B01 LBL B
B02 1
B03 STO +A   調べる数値を加算する
B04 RCL A
B05 5      調べる数値を5で割る
B06 ÷
B07 FP (FRACのこと)
B08 X キ 0 ?   5で割り切れたかチェック
B09 GTO B    割り切れなければ LBL B へ戻る
B10 RCL A
B11 3      調べる数値を3で割る
B12 ÷
B13 FP
B14 X キ 0 ?   3で割り切れたかチェック
B15 GTO B    割り切れなければ LBL B へ戻る
B16 1      5と3で割り切れたのでカウンターを1上げる
B17 STO +E   Eに1加算する
B18 RCL E    Eを読み込む
B18 20      カウンターが20になったかチェック
B20 X キ Y ?
B21 GTO C    20でないなら LBL C へ行く
B22 RCL A    現在実行中の数を読み込む
B23 STO +F   現在実行中の数をFに加算する
C01 LBL C
C02 RCL E    現在の5と3で割り切れた数を読み込む
C03 40     40か否か
C04 X キ Y ?   比較する
C05 GTO D   40でないなら LBL D へ行く
C06 RCL A
C07 STO +F   現在実行中の数をFに加算する
D01 LBL D
D02 RCL E    現在の5と3で割り切れた数を読み込む   
D03 60
D04 X キ Y ?   60か否かチェック
D05 GTO B    60でないなら LBL B へ行く
D06 RCL A
D07 STO +F   60の時の値を加算する
D08 RCL F    20,40,60の時の値の加算されたものをXレジに読み込む
D09 STOP    答えが表示されておわり

これで終わりです。


使用した電卓は HP32Sii です。 答えの”1800”がでるまでに48秒くらいかかりました。
このソフトでは一つづつすべての数値を調べていますが、kusakaさんに指摘で5の倍数だけ調べればいいわけですから
B02の1を5に変えることにより20秒で済むようになりました。

前回 HP32S を使い今回 HP32Sii を使ったのですが、デバッグ時の使い勝手は HP32S の方が良いですね。
HP32Sの方が多少機能が低いようですが プログラムモードの時ステップ送りをするのに1キーですむのにたいして
HP32Sii ではキーを2回押さなければならずデバッグ中にプログラムを壊してしまうことがありました。



by telmic-gunma | 2017-10-14 13:12 | HP電卓 | Trackback | Comments(2)

kusakaさんから同じ問題をC言語で解いたもの送っていただいたので載せてみます。

********************************************************************
私はRasberry Pi+Cで解いてみました。(Raspberry Piとは6千円程度のワンボードコンピューターで64ビット1.2Gで動作します。)
完成までは、なんだかんだで3時間以上かかったと思います。
大した計算量ではないようですが、電卓だと5分もかかるんですか。 Raspberry Piだと一瞬でした。
c0335218_09510123.png

全プログラムリスト

#include <stdio.h>

long money = 200000;
long menu_a = 650;
long menu_b = 780;
long menu_c = 980;
long ans_a, ans_b, ans_c;
long max_count(long, long);
long max_combination(long, long, long);
void print_results(void);

main()
{
int i;
long a = max_count(money, menu_a);
//printf("hello %ld\r\n",a);
for(i = 0; i < a; i++){
ans_a = a - i;
//printf("b\r\n");
if(max_combination(money - (ans_a * menu_a), menu_b,menu_c) != 0){
print_results();
return 1;
}
}
printf("No ansuer!\r\n");
}
long max_count (long l, long price){
return l/price;
}
long max_combination(long m, long lo_price, long hi_price) {
long c;
int d;
long lest;
c = max_count(m, hi_price);
lest = m;

for(d = 0; d < c; d++){
lest = m - (hi_price * d);
//printf("m = %d ", m);
//printf("d = %d ", d);
//printf("lest of money = %d\r\n", lest);
if(lest % lo_price == 0){
ans_c = d;
ans_b = lest / lo_price;
return 1;
}
}
return 0;
}
void print_results(void)
{
printf("Max combination is\r\n");
printf("650_menu x %d\r\n", ans_a);
printf("780_menu x %d\r\n", ans_b);
printf("980_menu x %d\r\n", ans_c);
printf("Total = %d\r\n", ans_a * menu_a + ans_b * menu_b + ans_c * menu_c); }


Max combination is
650_menu x 286
780_menu x 3
980_menu x 12
Total = 200000




以前 教えていただいた アルストロメリアの花です。
今日 2017年10月11日 まだ咲いています。寿命がながいですね。

c0335218_10262574.jpg


おくらの花です。
シンプルで綺麗、好きですね。  これもまた 長生き。

c0335218_10265969.jpg


by telmic-gunma | 2017-10-11 10:33 | HP電卓 | Trackback | Comments(4)

HP電卓を操作しやすくするために、写真のような台を発砲スチロールで作って見ました。
HP電卓の液晶画面は見る角度があまり斜めになると数字以外の記号などが表れて見ずらくなるのですが、
すこし角度を付けてやると見やすくなり且つキー操作もやりやすくなりました。

c0335218_18194215.jpg
さて 本題はこれではありません。
山梨にいる友達から以下のプログラムコンテストのチラシをもらいました。

c0335218_18183228.jpg

コンピュータ言語は C, Java, VBA から選択となっていました。賞金は20万円 
裏にサンプルプの問題が載っていました。

c0335218_18190557.jpg
本番にでる気はありませんが、この問題ならそんなにメモリーも必要とせずHP電卓で解くにはちょうどいいのでないかと思い挑戦してみました。
答えを先に言ってしまうと

きつね蕎麦  286
山菜蕎麦     3
鴨南蛮蕎麦   12

計算は数の大きい方からスキャンしていき答えも大きい方にあったので、計算時間はHP32Sで5分ほどだったと思います。
片手間に農作業をやりながらの製作で一日半かかりました。 こんなに時間かかってはコンテスト参加は無理ですね。
CやVBAなど他の言語で作ればもっと早く出来ると思いますが、やはりHP電卓でやるところに意味があると思います。( なぜなら わたしはHP電卓のファンだから ただそれだけですけど )
最初は連立方程式を作れば解けると思っていたのですが、やはりプログラムで一つづつ値を変えながら試すしか方法が無いようです。
それなりに苦労をした結果を載せてみます。


全プログラムリスト (HP32S を使用)


A01 LBL A
A02 RCL E 全合計目標金額
A03 RCL X  きつね蕎麦の単価
A04 ÷    きつね蕎麦での最大皿数
A05 LP (INTのこと)  整数部のみ取り出す
A06 STO A  きつね蕎麦での全皿数をしまう

B01 LBL B
B02 1
B03 STO -A きつね蕎麦の全皿数を一つ減らす
B04 XEQ C  この状態で山菜蕎麦と鴨南蛮蕎麦の数を計算する
B05 RCL A きつね蕎麦の数を読み込む
B06 PSE 現在計算中のきつね蕎麦の数を表示
B07 GTO B 次の数のきつね蕎麦を計算

C01 LBL C
C02 RCL A きつね蕎麦の数
C03 RCL X きつね蕎麦の単価
C04 X きつね蕎麦の合計金額
C05 RCL E 全合計金額目標
C06 X<>Y 全合計金額目標ときつね蕎麦の合計金額の比較
C07 -   きつね蕎麦の残金
C08 STO F きつね蕎麦の残金
C09 RCL Y 山菜蕎麦の単価
C10 ÷   山菜蕎麦の数
C11 IP (INTのこと) 整数部のみ
C12 STO B 山菜蕎麦の数

R01 LBL R
R02 RCL B 山菜蕎麦の数
R03 RCL Y 山菜蕎麦の単価
R04 ✖   山菜蕎麦の全額
R05 RCL F きつね蕎麦の残金
R06 X<>Y きつね蕎麦の残金ときつね蕎麦の残金の比較
R07 -   山菜蕎麦、きつね蕎麦の残金
R08 STO G
R09 RCL Z 鴨南蛮蕎麦の単価
R10 ÷   鴨南蛮蕎麦の単価で割る
R11 STO C
R12 FP (FRACのこと)少数点以下を取り出す
R13 X=0 ? 鴨南蛮蕎麦の単価で割り切れるか
R14 STOP 割り切れたら終了
R15 1
R16 STO -B 山菜蕎麦を一つ減らす
R17 RCL B  山菜蕎麦の数を読み込む。
R18 X キ 0 ? 山菜蕎麦の残数がゼロでないか
R19 GTO R  ゼロでないなら減らした山菜蕎麦で計算しなおす
R20 RTN   ゼロならばきつね蕎麦の数を減らして計算をやり直す


変数表
A きつね蕎麦の数
B 山菜蕎麦の数
C 鴨南蛮の数
D
E 全合計目標値 ( 200,000 ) 初期値入力しておく
F きつね蕎麦の残金
G きつね蕎麦と山菜蕎麦を取ったあとの残金
L ループ表示カウンター
X きつね蕎麦の単価 ( 650 ) 初期値入力しておく
Y 山菜蕎麦の単価  ( 780 ) 初期値入力しておく
Z 鴨南蛮の単価   ( 980 ) 初期値入力しておく

これで終わりです。


それなりにある程度頑張れば出来るという、このくらいの問題が丁度いいですね。
ちょうどバズルを解く楽しみなんでしょうか。
そうそう 今回この問題が解けた理由がまだありました。
一週間以内に解けなければ一杯おごると約束をしたからです。
私が何か行動を起こすには、適度なプレッシャーが必要みたいです。
べつに解けない方でも良いのですけれどね。


次 現在の畑の状況です。
白菜は一個50円の苗を20個買ってきて植えて19個が大きく育ちました。

c0335218_21164680.jpg


チンゲン菜は 種をまきすぎたので一杯生えすぎました。 間引きながら食べてます。
やはり 種をまくときに計算しておかないといけないのですね。
チンゲン菜 二度目だと思うのですが、なかなか学べないです。

c0335218_21173644.jpg










by telmic-gunma | 2017-10-09 21:30 | HP電卓 | Trackback | Comments(2)