質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2496閲覧

Swiftで素数判定アプリを作っているのですが...

daisuke-han

総合スコア49

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2015/09/15 09:32

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet var Label1: UILabel! 6 @IBOutlet weak var Text1: UITextField! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view, typically from a nib. 11 } 12 13 override func didReceiveMemoryWarning() { 14 super.didReceiveMemoryWarning() 15 // Dispose of any resources that can be recreated. 16 } 17 18 @IBAction func Button1(sender: AnyObject) { 19 let n = Text1.text 20 if Int(n!) < 2 { 21 Label1.text = "素数ではありません" 22 } 23 if Int(n!) == 2{ 24 Label1.text = "素数です" 25 } 26 if Int(n!)! % 2 == 0{ 27 Label1.text = "素数ではありません" 28 } 29 var i = 0 30 for i == 3; i <= Int(n!)! / i; i += 2{ 31 if Int(n!)! % i == 0{ 32 Label1.text = "素数ではありません" 33 } 34 } 35 Label1.text = "素数です" 36 } 37 38 39 } 40

このようにしてみましたがエラーになります。
エラー回避の方法と、またこれが素数を判定するものとして正しいのかということ自体がわからないので教えていただけるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらく、素数判定の最後のfor文で、Int(n!)で引っかかってエラーがでていると思われます。

こんな感じでどうでしょうか。

一度、if let 文を使って、textFieldのtextがあるかどうかと、文字列がIntに変換できるかを確認してから、
素数判定を走らせているので、判定文の中で、アンラップする必要もないです。

環境がわかりませんが、Swift1.2以上なら大丈夫かと思います。
素数判定は色々ありますが、daisuke-hanさんの書いてあるものそのまま(試し割り法)にしてあります

Swift

1 func isPrimeNumber(num: Int) -> Bool { 2 if num < 2 { 3 return false 4 } else if num == 2 { 5 return true 6 } 7 8 if num % 2 == 0 { 9 return false 10 } 11 12 for var i = 3; i * i <= num; i += 2 { 13 if num % i == 0 { 14 return false 15 } 16 } 17 return true 18 } 19 20 @IBAction func Button1(sender: AnyObject) { 21 if let text = Text1.text, number = Int(text) { 22 Label1.text = isPrimeNumber(number) ? "素数です。" : "素数ではありません。" 23 } else { 24 Label1.text = "判定できませんでした。" 25 } 26 } 27

投稿2015/09/15 10:15

編集2015/09/15 14:44
sgr_ksmt

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/09/15 12:03

``` i < num / i ``` のところ ``` i <= num / i ``` じゃないと、例えばnumが9のときにループを抜けちゃってtrueを返しちゃうんじゃないですかね。 さらに言うと、かけ算と割り算の負荷を考えると ``` i*i <= num ``` の方がより良いと思います。
sgr_ksmt

2015/09/15 14:41

ご指摘ありがとうございます。 回答の方、修正させていただきます^^/
daisuke-han

2015/09/16 03:56

ありがとうございました。 完璧でした。これまで知らなかった if let についても学ぶ機会になり大変良かったです。 yuba さんもご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問