ブログトップ

電子工作やってみたよ

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

プログラムコンテストとは関係ないけど、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


トラックバックURL : https://telmic.exblog.jp/tb/28105255
トラックバックする(会員専用) [ヘルプ]
Commented by Kusaka at 2017-10-23 15:19 x
素数に1は含まれないんですね。 ネットで調べて知りました。
なのでi=1でなくi=2にすれば高井さんの答えと同じになります。
HP電卓だと30分もかかりましたか。 私の無駄コードのように全数をチェックしたら
1時間では終わりませんね。やっぱり計算中は電力が増えるんでしょうか?
台風で畑のシカよけネットが倒れてしまいました。今日中に直さないと大事な黒豆
食べられちゃう。
Commented by telmic-gunma at 2017-10-23 16:01
> Kusakaさん
ありがとうございます。
台風なんともなく過ぎてしまいました。
こちら 秋になったらイノシシやシカの話を聞かなくなりましたね。もう 寒いからでしょうか。
玉ねぎの苗 200本買ってきたのでこれから植えます。
そうそう 私が以前にやったサイクロイド曲線の計算に挑戦してみませんか。
私 解らないので20個の直線近似で置き換えてやりましたけど、数学勉強して曲線のまま計算やりたいなと思っています。


Commented by Kusaka at 2017-10-25 15:54 x
高井さんのアルゴリズムを追加して改造しました。
調べる数は奇数だけと割る数も奇数だけ、また割る数が調べる数の1/2を
超えたら終わり。計算時間が短縮されて7mSになりました。

for(i = 3; i <= 1000; i+=2){
prime = 1;
for(a = 3; a < i >> 1; a+=2){
if(i % a == 0){
prime = 0;
break;
}
}
if(prime){
// printf("%d\r\n", i);
num_ans++;
sum_ans += i;
}
}
Commented by telmic-gunma at 2017-10-25 20:45
> Kusakaさん
ねえ 仕事まじめにやってますか?
それにしてもすごいですね。
30分 対 7mSec
比率でいうと 26万倍
まあ HP電卓で数学の勉強をするには、このくらい遅い方が都合がいいのですけれどね。
と 負け惜しみ言ってます。
名前
URL
削除用パスワード

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

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