ブログトップ

電子工作やってみたよ

プログラムコンテストの例題をHP電卓でやって見た No3

ディスコのプログラムコンテストをネットで見たら 問題はチラシ広告だけでなくネット上にも在り合計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回押さなければならずデバッグ中にプログラムを壊してしまうことがありました。



トラックバックURL : https://telmic.exblog.jp/tb/27989514
トラックバックする(会員専用) [ヘルプ]
Commented by Kusaka at 2017-10-14 22:01 x
最近CPUのパワーが十分なので、あまり実行速度やコードサイズを気にしてプログラムを組む必要がないですね。逆に計算に何十秒もかかるHP電卓だと効率を考えてプログラムしないといけないので逆に面白いですね。(でも私はいりませんよ。タダでも)
Commented by telmic-gunma at 2017-10-15 13:18
> Kusakaさん
こんにちは ありがとうございます。
HP電卓は40年くらい昔のものですからね。
わたし これでも新しすぎると思っているのですよ。
次は 計算尺に挑もうと思っていますけど。
まあ 自転車とスポーツカーを比べてはダメ。
名前
URL
削除用パスワード

※このブログはコメント承認制を適用しています。ブログの持ち主が承認するまでコメントは表示されません。

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