[アルゴリズム] 1から100までの素数を取得(Go言語編)

2017年3月6日

Go テクノロジー プログラミング 特集

t f B! P L
今回のGo言語は、コマンドラインで上限数値の入力を実現してみました。 初心者が故に戸惑いポイントは、コマンドラインからの受け取った値は、文字列の型になってしまい、数値に変換しなければいけないのだが、GO言語のライブラリをそれに合ったものに切り替えなければいけないのが少しめんどくさかった。 インタプリタ言語に慣れすぎたせいなのか? 改めてC言語をもっとやりこんでからGOをした方がいいのかもしれないね。

ソースコード

package main import ( "fmt" "os" "strconv" ) func getPrimeNumber(num int) int{ flg := 0 for i:=2; i<num-1; i++ { if (num % i == 0){ flg = i break } } return flg } func main(){ max , _ := strconv.Atoi(os.Args[1]) nums := []int{} for i:=2; i<=max; i++{ res := getPrimeNumber(i) if (res == 0){ nums = append(nums , i) } } fmt.Println(nums) }

実行

$ time go run prime_number.go 100 [2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97] real 0m0.208s user 0m0.119s sys 0m0.067s

負荷計測(非コンパイル)

100 : 0.208s 1000 : 0.211s 10000 : 0.279s 100000 : 4.077s 1000000 : 5m24.402s

コンパイルした版

$ go build prime_number.go $ ./prime_number 100
100 : 0.008s 1000 : 0.010s 10000 : 0.066s 100000 : 3.784s 1000000 : 5m24.712s
コンパイルしても全然速くない!!! C言語の方が速い!!! とりあえず、こんな事がわかりました。 実験した環境はMacBookPro2016latorです。 core i7なので、そんなに悪くないんだけどな・・・ 言わずもがな、言語の限界でしょうね。

解説

コマンドラインからの値の受け取り

”111”という文字列を受け取れる。※この際111は数値なのだが、文字列で受け取られる事を忘れると型エラーが出るので要注意 $ go run hoge.go 111 import "os" os.Args[1] > 111 (string)

文字列から数値に型変換

strconvをimportして、Atoi関数で変換できるが、受け取り側の”_”は、nilを入れ込む器が必要なので、忘れないように。 ※入れないとエラーになります。 import "strconv" hoge , _ := strconv.Atoi(*文字列*)

変数の型を確認する

reflectライブラリで型を確認することができます。 import "reflect" refrect.TypeOf(*変数*)

配列操作まとめ

# 整数のみの配列定義 num := []int{} # 文字列のみの配列定義 str := []string{} # 型の混合定義 value := []interface{} # 配列の追加 num := []int{1 , 10} num = append(num , 100); > [1 , 10 , 100] # 要素数を数える len(num) # 配列のデータをクリアする num = nil

リンク

色々なプログラム言語でアルゴリズム学習

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ