目录
循环的嵌套
常用的三种循环有 for , while , do while ,这三种循环往往会嵌套在一起从而更好地解决问题,被称为“循环嵌套”。
例子:打印素数
题目描述:
找出100~200之间的素数,并打印在屏幕上。
素数又称为质数,只能被1和本身整除的数字。想要从100~200中找出素数,首先要有100~200之间的数字。这里我们使用 for 循环。
想要判断是否为素数,需要用 2~i-1 之间的数字一个个地去试除 i;那就要产生 2~i-1 之间的数字
如果 2~i 之间有数字能整除;则不是素数;反之则是。
完整代码如下:
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
//产生的i就是100到200之间的数字
int flag = 1;
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;//表示i不是素数
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\ncount = %d\n", count);
return 0;
}
结果如下:
优化写法1
因为偶数都能被2整除,所以偶数一定不是素数。所以我们就可以从101开始,每次加2,这样每次产生的都是奇数,从而需要判断的数就少了一半。代码如下:
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)
{
int flag = 1;
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\ncount = %d\n", count);
return 0;
}
优化写法2
举个例子:判断16是否为素数,那就要拿2~15之间的数字一个个试除,很浪费时间。
假设n = 16,且 n == a * b ,那么a和b中至少有一个数字是 <= 的。
例如16 = 2 * 8和16 = 4 * 4。当我能在2~15之间的比如5 6 7 8 9 10 11 12 13 14 15这些数字中找到一个因子的时候,它的另一半一定在它的前面1 2 3 4 里,这样我们的判断范围再次缩小,只要在2到之间试除即可。
这种方法需要用到库函数 sqrt( ) - 开平方 ,需要加上 #include <math.h>
优化代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)
{
int flag = 1;
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\ncount = %d\n", count);
return 0;
}