刚开始学编程语言中循环判断的时候,总是遇到判断是否是质数的问题,经常写不正确,后来经过仔细梳理,我才发现有这样一个小猫腻存在,切听我一一道来。
我将这个问题分成了两类,一类是是否为闰年问题,一类就是是否是质数问题:
一、判断是否为闰年问题
var year = scanf()
if (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0){
print("\(year) is leapyear")
}
else{
print("\(year) is not leapyear")
}
通过代码我们可以看到,这类问题的共同特征是通过单单一个条件就可以确定判断他的是否两面,比如直接拿出来一个年份(year),通过判断条件 (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) 就可以直接判断出他是否是闰年。与之比较的球质数的时候就有问题了。
二、是否是质数问题
var n = scanf()
var isZhishu = true //声明的 bool 类型的中间值
for i in 2..<n {
if n % i == 0{
isZhishu = false
}
}
//通过这个来绕过 对 if n % i !== 0 完全的循环判断
if isZhishu {
print("\(n)是质数")
}
else{
print("\(n)不是质数")
}
再求是否是质数时,我们通过循环判断 n % i != 0 此条件,一旦这个条件满足那么就可以得到这个问题否的一面,也就是他不是质数,因为2~n-1有可以整除他的数,但这个问题是的一面,就必须从头到尾循环一遍才能解决,所以你不能这样做:
for i in 2..<n {
if n % i != 0{
print("\(n)是质数") //这是错的
}
}
因为这样满足条件就跳出循环,就不能满足我们从头到尾循环一遍再判断的要求,这就是与求 判断是否是闰年问题 的不同之处,判断是否是质数问题 否的一面通过此条件便可直接得出结论, 但 是的一面就不可以,他必须从头到尾循环判断,于是我们碰到这种问题就要借助中间 bool类型 变量 isZhishu 来实现我们的判断。
这个问题搞清楚了,我就再分享给大家几种方法,每种问题多想几种解法对我们的思维方式培养是很有帮助的哦~
// 法2 : 如下
#if false
var n = scanf()
//用while
for i in 2...n{ //这也需要注意 循环到 n自身而不是n-1
if i == n{ // 此方法精妙之处。说明循环完了还没找到
print("\(n)是质数")
break
}
if n % i == 0{
print("\(n)不是质数")
break
}
}
//法三:
#if false
var n = scanf()
var index = 0
for i in 2...n{
if (n % i == 0){ //有一个数能被n整除就存下来
index = i //关键点是将这个数存下来
break // i < n
}
}
if index == n { // 是素数
print("是素数")
}else{
print("不是素数")
}
#endif
随手记:
求100 到300之间能被3整除的数
for i in 100...300{
if i % 3 == 0{
print("\(i)\n")
}
}
那么100到300之间不能被3整除的数:
for i in 100...300{
if i % 3 == 0{
continue //continue 是关键
}
print("\(i)\n")
}
【ps:写到这里,也许会有人觉得我写的特基础,特无聊。不过好像也确实是样。好吧,矫情了一下,因为我也是初学者,因为在学其他语言的时候遇到过这些问题,在学Swift时又重新遇到了,就想着总结一下,希望帮助其他初学者能绕过这些小坑,少走些弯路。共同学习,共同成长,谢谢大家。O(∩_∩)O~】