标题

在Swift语言中,使用函数去判断一个整数是否为素数。

正文

一、编写过程

0.思路

我们都知道素数是除了其自身外,除以任意一个大于 1 的自然数,余数都不为 0。那么想知道一个数是不是素数,直接就可以想到让这个数按顺序一个一个去取余数。那既然涉及到了按顺序一个一个试,那肯定是用循环嘛!

1.声明函数

所以我们先声明一个参数为一个整数,返回值是一个布尔值的函数(也可以返回其他类型的值,返回布尔值比较方便使用)。

func prime(number: Int) -> Bool{

}

2.写循环

因为一个数除以一个比自己大的数,余数就是其本身,肯定不为 0,所以循环的范围是 2 到 number - 1(为什么从 2 开始就不用多说了吧)。

func prime(number: Int) -> Bool{     for i in 2 ..< number {     } }

3.取余判断

我们可以利用循环的特性,让参数依次对循环限定区间内的数依次取余数,将结果归为两类:一种是取余结果为 0;一种是不为 0。

这样其实我们已经知道这个参数是不是素数了。只要循环运行下来,取余过程中没有产生余数为 0 的情况,则参数为素数,否则其不为素数。

那这样就好办了,只要用一个数去接受结果,每当取余结果不为 0 时,就让这个数 + 1 最后让这个数增加的量与参数比较即可。

所以我是这样写的,因为循环最大运行次数比参数小 2,所以我们就声明一个为 2 的变量。当 number 取余等于 0 时,利用break跳出循环;当 number 取余不等于 0 时,令我们声明的变量 judge + 1。

func prime(number: Int) -> Bool{

    var judge = 2     for i in 2 ..< number {         if number % i == 0 {             break         }         else {             judge += 1         }     } }

4.返回结果

显而易见,如果这个循环运行下来,judge 等于 number 则 number 是素数,不然这个循环一定是碰到了 break,也就一定不为素数。所以我们再用一个 if else 语句就行了,对应的返回值随便自己怎么写。

if judge == number {

        return true

}

else {

        return false

}

5.补充漏洞

写到这里,细心的网友可能会发现,这个函数只能判断 2 及以上的整数。那怎么办呢?

解决这个问题也很好办,因为 2 以下的整数全都不是素数,在循环之前加一个 if 语句就行了。

if number <= 1 {

        return false

}

6.输出结果

至此,函数的主体就已经完成了。剩下的就是调用和输出结果了,我就不详细展开说了(可以看我文章末尾处的作业原文),稍微设计一下打印结果,注意和函数返回的值对应即可。

注:因为函数内的值无法直接调用,所以为了打印结果更直观,我额外定义了一个 num0 去给参数赋值。

var num0 = 要判断的整数 if prime(number: num0) {     print(num0, "是素数") } else {     print(num0, "不是素数") } 

7.优化函数(2022.12.05.22:00 - 更新)

其实写到这里简单的功能已经可以实现了,但是我觉得作为一个函数,调用起来还是过于麻烦,我总不能每次调用这个函数都用一个 if else 去补充输出吧。所以我想将所有的东西都写进函数里面去,只通过调用函数,打印函数的返回值就完成整个判断。

一开始我将函数的函数的返回值改成元组,但是打印起来还是麻烦,能不能将返回值直接改成一个字符串,让函数直接输出判断结果呢?肯定是可以的,我是初学者,并不会将一个整数加入到一个字符串中,感谢 Swift入门(九)——String与Int、Double、Float等数字相互转换 这篇文章,我知道了怎么将数字转换为字符串,由此写出了第二版代码。

这个版本里面的函数 prime 才是一个完善的判断一个数是否为素数的函数,因为他的返回值直接就是一个可视的判断结果。

二、全部代码

1.第二版(2022.12.05.22:00 - 更新)

使用 \(number) 将参数 number 转换为字符串,从而解决旧版代码中需要在函数外写 if else 语句去优化输出结果的麻烦,方便多次调用该函数

import UIKit

//用函数判断一个整数是否为素数。

func prime(number: Int) -> String{

if number <= 1 {

var result = "\(number)不是素数"

return result

}

var judge = 2

for i in 2 ..< number {

if number % i == 0 {

break

}

else {

judge += 1

}

}

if judge == number {

var result = "\(number)是素数"

return result

}

else {

var result = "\(number)不是素数"

return result

}

}

//【在 number 后输入您要判断的整数,输出结果会告诉您这个数是否为素数】

print(prime(number: -2))

2.第一版

import UIKit

//用函数判断一个整数是否为素数。

func prime(number: Int) -> Bool{

if number <= 1 {

return false

}

var judge = 2

for i in 2 ..< number {

if number % i == 0 {

break

}

else {

judge += 1

}

}

if judge == number {

return true

}

else {

return false

}

}

//【将您要判断的整数赋值给 num0 ,输出结果会告诉您这个数是否为素数】

var num0 = 193

if prime(number: num0) {

print(num0, "是素数")

}

else {

print(num0, "不是素数")

}

三、结束

本文改编自本人的一次 Swift 作业,下面是作业原文

import UIKit

//1.用函数判断一个整数是否为素数。

//思路:我们都知道素数是除了其自身外,除以任意一个大于 1 的自然数,余数都不为 0 。那么想知道一个数是不是素数,我直接想到就是按顺序一个一个去取余数,那既然涉及到了“按顺序一个一个试”,那肯定是用循环嘛

func prime(number: Int) -> Bool{//声明一个函数,参数为一个整数,返回值是一个布尔值

if number <= 1 {

return false

}//下列循环只能判断大于 1 的整数,所以其他的要单独讨论,而且素数是正整数的真子集,所以 0 和负整数也可以直接返回一个 false 增加函数的适用性

var judge = 2//因为我下面写的循环范围是 2 到 number - 1 ,所以循环的运行次数会比 number 小 2 ,因此我们初始就赋值给 judge 为 2

for i in 2 ..< number {//number 之后的数不用考虑,因为一个数除以一个比自己大的数,余数就是其本身,肯定不为 0

if number % i == 0 {

break

}//如果 number % i 等于 0 ,则显而易见,这个 number 在除了自己以外,还有大于 1 的自然数可以整除此 number 也就是说这个数不是素数,利用break跳出循环,进行后面的步骤

else {

judge += 1//如果余数不为 0 ,就让 judge 加上 1 ,后面会用上

}

}

if judge == number {

return true

}//如果 judge 和 number 相等,显而易见,上面的循环是不可能运行到 break 处的,因为循环最多运行 number - 2 次,且 judge 初始为 2 。这也证明了 number 在循环规定范围内不会被任何数整除,也就是说 number 是素数,此时我们让函数返回一个 true

else {

return false

}//如果 judge 和 number 不相等,显而易见,上面的循环一定是运行到 break 处的,同理我们可以知道 number 一定不是素数,此时我们让函数返回一个 false

}

//【将您要判断的数赋值给 num0(只能判断整数),打印结果会告诉您这个数是否为素数】

var num0 = 193//因为函数中的参数和定义的值无法在函数外使用,为了在控制台可以打印出我们要判断的数具体是几,特此多定义一个数,再将这个数赋值给变量

if prime(number: num0) {

print(num0, "是素数")

}

else {

print(num0, "不是素数")

}//调用函数,参数 number 就是我们要判断是数,如果 number 是素数,则会返回 true ,否则会返回一个 false ,然后打印对应的内容告诉您结果

感谢

1.Swift入门(九)——String与Int、Double、Float等数字相互转换  by  bestswifter

2.感谢您的阅读,希望可以帮助到您!如有不足之处,还望指出!

查看原文