/*******************************************
题目:把以内(不包括)的所有素数都打印到屏幕上,并且求出素数的个数是多少?
素数释义:
在大于1的整数中,只能被1和这个数本身整除的数,如2、3、5、7、11。也叫质数。
解题思路:最直观的方法,根据定义,因为质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可
以下这个程序代码是用while循环嵌套的方法来实现。
*********************************************/
#includeiostream
usingnamespacestd;
intmain()
{
intn=2;//定义一个整形的变量n来代表以内的所有整数,初始化为2
intcount=0;//整形变量count作为记录素数的个数
while(n)//外层循环每次n的值都增加1,直到99为止
{
//内层循环判断n是否是素数
inti=2;
while(1)
{
if(n==2)
{
cout以内的素数有:n;
count++;
break;
}
elseif(i==n)
{
coutn;
count++;
break;
}
elseif(n%i==0)
{
break;
}
i++;
}
n++;
}
coutendl以内的素数总数是:countendl;
system(pause);
return0;
}
运行结果如下:
上述判断方法,明显存在效率极低的问题。对于每个数n,其实并不需要从2判断到n-1,我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数.现在让我们用一个for循环的嵌套来实现。程序如下:
#includeiostream
#includemath.h
usingnamespacestd;
intmain()
{
intn=2,count=0;
for(;n;)
{
if(n==2)
{
cout以内的素数是:n;
count++;
n++;
continue;
}
intk=sqrt(n);//k用来记录n的平方根
boolflag=true;//定义bool类型的变量flag,如果判断到不是素数就把该变量置为false
//内层for循环判断n是否是素数
for(inti=2;i=k;i++)
{
if(n%i==0)
{
flag=false;
break;
}
}
if(flag)
{
coutn;
count++;
}
n++;
}
coutendl以内的素数总数是:countendl;
system(pause);
return0;
}
运行结果如下:
希望各位能坚持不懈地坚持编写程序,成为一个牛牛的程序员。