题目1:打印100-200之间的素数(素数:只能被1和它本身整除的数字)
方法1:试除法1.0
"试除",就是不断地尝试能否整除。比如要判断自然数 x 是否质数,就不断尝试小于 x 且大于1的自然数,只要有一个能整除,则 x 是合数;否则,x 是素数。
显然,试除法是最容易想到的思路。不客气地说,也是最平庸的思路。不过呢,这个最平庸的思路,也有好多种境界。不信请看下文:
假设要判断 x 是否为质数,就从 2 一直尝试到 x-1。这种做法,其效率应该是最差的
代码呈现:
//打印100-200之间的素数
//素数:只能被1和它本身整除的数字
#include <stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200;i++)
{
//判断i是否为素数
//拿2~i-1之间的数字试除
int j = 0;
int flag = 1;//假设是素数
for(j=2;j<=i-1;j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
方法2(改版):试除法2.0
在1.0版本的基础上,我们使用了sqrt函数(开平方根函数,在math.h头文件中)
#include <math.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
//判断i是否为素数
//拿2~i-1之间的数字试除
int j = 0;
int flag = 1;//假设是素数
for (j = 2; j <= sqrt(i); j++) //sqrt函数是开平方函数
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
方法3(改版):试除法3.0
在2.0版本中我们使用了sqrt函数(开平方根函数,在math.h头文件中),较少了比较的次数,在3.0版本中进一步的减少所需比对的次数
基础奇数才有是素数的可能性,所以我们去除偶数
int main()
{
int i = 0;
for (i = 101; i <= 200; i+=2)//只取奇数,因为偶数不可能是素数
{
//判断i是否为素数
//拿2~i-1之间的数字试除
int j = 0;
int flag = 1;//假设是素数
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
题目2:闰年的判断和打印(打印1000年到2000年的闰年)
首先我们要先找到闰年的判断条件:
①能被4整除,并且不能被100整除的是闰年
②能被400整除的是闰年
方法1:最基础的方法
int main()
{
int y = 0;
for (y = 1000; y <= 2000; y++)
{
//判断是否为闰年
if (y % 4 == 0)
{
if (y % 100 !=0 )
{
printf("%d ", y);
}
}
if (y % 400 == 0)
{
printf("%d ", y);
}
}
return 0;
}
方法2:改进版本
int main()
{
int y = 0;
for (y = 1000; y <= 2000; y+=4)//y+=4 ---->减少所需要检测的数量
{
//判断是否为闰年
if ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))
{
printf("%d ", y);
}
}
return 0;
}
题目3:求解两个数的最大公约数
方法1:基础法
int main()
{
int m = 0;
int n = 0;
//输入
scanf("%d %d", &m, &n);
int k = (m > n ? m : n);
while (1)
{
if (m % k == 0 && n % k == 0)
{
break;
}
k--;
}
printf("%d\n", k);
return 0;
}
方法2:辗转相除法
辗转相除法,又称欧几里德算法(Euclidean Algorithm),是求两个数的最大公约数(greatest common divisor)的一种方法。
用较大的数除以较小的数,再以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数。
//方法二:辗转相除法
int main()
{
int m = 0;
int n = 0;
//输入
scanf("%d %d", &m, &n);// 18 24
int k = 0;
while (k = m % n)
{
m = n;
n = k;
}
printf("%d\n", n);//结果为6
return 0;
}