(本篇同时介绍Python和c语言下的continue和break)
首先我们先写一个函数:输入一个最大值,求这个[1, 最大值)这个区间内的质数
Python:(因为为了让新手能看懂,我们这里就不写的太难,基于python3.8)
def get_prime(num):
if num <= 1:
return []
if num == 2:
return [2]
res = []
for i in range(2, num):
tem = []
for j in range(2, i):
tem.append(i % j)
if not tem.count(0):
res.append(i)
return res
print(is_prime(100))
首先我们对该函数进行解释:当输入的num = 1时,而1不属于质数,所以返回为空列表,而当num为2时,也只有2本身这个质数。但num大于2时,我们对区间[2, num) 内的数进行逐步遍历。例如num = 100,某次的遍历值i = 10,此时我们再对[2, i)的区间进行变量,向临时列表tem中添加i % j的值(若一个数为质数,即除了1和它本身,它对任何数的相除的余数都不应为0),遍历完后如果我们在tem中找到了0,即表示该数i不是质数。如对于10来说,它的tem为[0, 1, 2, 0, 4, 3, 2, 1],其中有0,则表示它不是质数,而对于11来说,它的tem为[1, 2, 3, 1, 5, 4, 3, 2, 1],没有0则表示它是质数。
(除了使用tem.count(0)外,也可以直接使用0 in tem来进行判断tem中是否有0)
c语言:(为了新手能看懂,此处我们不使用动态内存开辟进行书写,如下c语言标准均为c99)
void GetPrime(int num, int* arr){
if (num <= 1)
return;
if (num == 2){
arr[0] = 2;
}
for (int i = 2; i < num; i++){
int have_zero = 0;
for (int j = 2; j < i; j++){
if (i % j == 0)
have_zero += 1;
}
if (!have_zero){
*arr = i;
arr++;
}
}
}
int main() {
int arr[100] = { 0 };
GetPrime(100, arr);
for (int i = 0; i < 100; i++)
if (arr[i] != 0)
printf("%d ", arr[i]);
return 0;
}
原理同上。
我们可以发现,无论是在python还是c语言中,对于一个合数(即非质数)如10,在j=2时,10 % 2 = 0,即在此时已经出现了判断10不是质数的数字0,但是此时我们的代码还是会继续向后走,这里是不是有点浪费空间和时间呢?对于此时的情况我们应该怎么去控制解决该情况?这时就需要使用到我们的流程控制语句 —— continue 和 break。
1.break - 用于结束循环结构,通常与分支结构if一起使用
格式:
在python中:
for ... in ...: ... if ...: break while ... : ... if ...: break
在c语言中:
for (...){ ... if (...){ break; } }while(...){ if (...){ break; } }
如当我们做一个密码输入系统,而且只给3次密码输入的机会:
在Python中:
password = "abcd1234"
for i in range(3):
if input("请输入密码:> ") == password:
print("密码正确")
else:
print("密码错误")
我们尝试执行代码:
可以发现此时输入正确还是错误,都需要继续输入,所以此时我们可以使用break语句,当密码输入正确时,我们停止输入,具体如下:
password = "abcd1234"
for i in range(3):
if input("请输入密码:> ") == password:
print("密码正确")
break
else:
print("密码错误")
此时我们再执行代码:
可以发现,当输入正确时,循环就停止了,代码也就结束了。
在C语言中:
int main(){
char password[10] = "abcd1234";
for (int i = 0; i < 3; i++){
char tem[10];
printf("Please Input Password :>");
scanf("%s", tem);
if (strcmp(password, tem) == 0)
printf("Password is true\n");
else
printf("Password is error\n");
}
return 0;
}
我们尝试执行代码:
可以发现此时输入正确还是错误,都需要继续输入,所以此时我们可以使用break语句,当密码输入正确时,我们停止输入,具体如下:
int main(){
char password[10] = "abcd1234";
for (int i = 0; i < 3; i++){
char tem[10];
printf("Please Input Password :>");
scanf("%s", tem);
if (strcmp(password, tem) == 0){
printf("Password is true\n");
break;
}
else
printf("Password is error\n");
}
return 0;
}
此时我们再进行执行代码:
可以发现,当输入正确时,循环就停止了,代码也就结束了。
2.continue - 用于结束当前循环,进入下一次循环,通常与分支结构中的if一起使用
格式:
Python中:
for ... in ...:
if ....:
continue
while ...:
if ...:
continue
C语言中:
for (...){ if (...){ continue; } } while (...){ if (...){ continue; } }
如我们输入一个字符串,对其进行输出时,对H和V字母不进行打印:
在Python中:不使用continue
for i in input("请输入字符串 :>"):
if i != "H" and i != "V":
print(i, end="")
当我们输入:HELLO VICTOR!
似乎能达到我们预期的理想,但如果print语句换成其他更为复杂的语句,直接将if放在外面可能会导致代码的累赘。此时使用continue,似乎有更好的效果:
for i in input("请输入字符串 :>"):
if i == "H" or i == "V":
continue
print(i, end="")
此时我们的print语句在外层,看着也更加简洁。执行结果为:
在C中:
char arr[20];
printf("Please Input string :>");
scanf("%s", arr);
for (int i = 0; i < strlen(arr); i++){
if (arr[i] != 'H' && arr[i] != 'V'){
printf("%c", arr[i]);
}
}
当输入HELLO,VICTOR!时执行如下:
分析同上,此时我们写一个continue版本:
char arr[20];
printf("Please Input string :>");
scanf("%s", arr);
for (int i = 0; i < strlen(arr); i++){
if (arr[i] == 'H' || arr[i] == 'V')
continue;
printf("%c", arr[i]);
}
所以截止到现在,我们学会了流程控制语句break和continue的使用,那么我们再对我们最开始的例子进行改造:
Python:
def get_prime(num):
if num <= 1:
return []
if num == 2:
return [2]
res = []
for i in range(2, num):
for j in range(2, i):
if i % j == 0:
break
else:
res.append(i)
return res
print(get_prime(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]
C语言:
void GetPrime(int num, int* arr){
if (num <= 1)
return;
if (num == 2){
arr[0] = 2;
}
for (int i = 2; i < num; i++){
int have_zero = 0;
int j = 0;
for (j = 2; j < i; j++){
if (i % j == 0)
break;
}
if (j == i){
*arr = i;
arr++;
}
}
}
int main() {
int arr[100] = { 0 };
GetPrime(100, arr);
for (int i = 0; i < 100; i++)
if (arr[i] != 0)
printf("%d ", arr[i]);
return 0;
}
输出结果为:
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