标题
在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.感谢您的阅读,希望可以帮助到您!如有不足之处,还望指出!