1.循环控制
例:判断素数
#include <stdio.h>
int main()
{
int x = 0;
int i = 0;
int isprime = 1;
printf("请输入数字:");
scanf_s("%d", &x);
for (i = 2; i < x; i++) {
if (x % i == 0) {
isprime = 0;
break;
}
}
if (isprime == 0) {
printf("不是素数");
}
else {
printf("是素数");
}
return 0;
}
问:课程中提到有种“聪明”的做法,可以不设isPrime,直接利用循环出口处循环变量和终点值的关系来判断循环是否break了。你觉得这种做法好吗?
答:好处:节省内存坏处:不利于后期维护
2.多重循环
例:输出100以内的素数
#include <stdio.h>
int main()
{
int i = 0;
int t = 0;
for (i = 2; i <= 100; i++) {
int isprime = 1;
for (t = 2; t < i; t++) {
if (i % t == 0) {
isprime = 0;
break;
}
}
if (isprime == 1) {
printf("%d ", i);
}
}
return 0;
}
例:输出50个素数
#include <stdio.h>
int main()
{
int i = 0;
int t = 0;
int count = 0;
for (i = 2; count<50; i++) {
int isprime = 1;
for (t = 2; t < i; t++) {
if (i % t == 0) {
isprime = 0;
break;
}
}
if (isprime == 1) {
printf("%d ", i);
count++;
}
}
return 0;
}
- 从嵌套的循环中跳出。
#include <stdio.h>
int main()
{
int one = 0;
int two = 0;
int five = 0;
for (one = 0; one <= 100; one++) {
for (two = 0; two <= 50; two++) {
for (five = 0; five <= 20; five++) {
if (one + two * 2 + five * 5 == 100) {
printf("需要%d个一角,%d个两角,%d个五角\n",one,two,five);
}
}
}
}
return 0;
}
break和continue只能跳出其所在的循环
1.goto out
#include <stdio.h>
int main()
{
int one = 0;
int two = 0;
int five = 0;
for (one = 0; one <= 100; one++) {
for (two = 0; two <= 50; two++) {
for (five = 0; five <= 20; five++) {
if (one + two * 2 + five * 5 == 100) {
printf("需要%d个一角,%d个两角,%d个五角\n",one,two,five);
goto out;
}
}
}
}
out:
return 0;
}
问:为什么课程中说goto的名声不好?用goto会怎么不好了?
答:破坏了代码的结构。
3.循环应用
例:前n项求和
#include <stdio.h>
int main()
{
int x = 0;
double i = 1;
double sum = 0;
printf("请输入数字:");
scanf_s("%d", &x);
for (i = 1; i <= x; i++) {
sum += 1 / i;
}
printf("结果为%f", sum);
return 0;
}
#include <stdio.h>
int main()
{
int x = 0;
double i = 1;
double sum = 0;
double sign = 1;
printf("请输入数字:");
scanf_s("%d", &x);
for (i = 1; i <= x; i++) {
sum += sign / i;
sign = -sign;
}
printf("结果为%f", sum);
return 0;
}
例:判断最大公约数
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
int i = 0;
int ret = 0;
printf("请输入两个数字:");
scanf_s("%d %d", &x, &y);
for (i = 1; i < x && y; i++) {
if (x % i ==0 && y % i == 0) {
ret = i;
}
}
printf("最大公约数是%d", ret);
return 0;
}
辗转相除法
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
int i = 1;
int ret = 0;
printf("请输入两个数字:");
scanf_s("%d %d", &x, &y);
if (x == 0 && y == 0) {
printf("无最大公约数");
}
else if (y == 0) {
printf("gcd=%d", x);
}
else if (x == 0) {
printf("gcd=%d", y);
}
else {
while (i != 0) {
i = x % y;
x = y;
y = i;
}
printf("gcd=%d", x);
}
return 0;
}
例:整数分解
#include <stdio.h>
int main()
{
int x = 0;
int ten = 1;
printf("请输入数字:");
scanf_s("%d", &x);
int t = x;
while (t > 9) {
t /= 10;
ten *= 10;
}
do {
int d = x / ten;
printf("%d ", d);
x %= ten;
ten /= 10;
} while (ten > 0);
return 0;
}