主题:输入M和N,统计M到N之间的素数的个数
#include <stdio.h>
#include <math.h>
int main()
{
int m,k,i,n=0,a,b;
int prime; //以prime的真假来标记是否为素数
scanf("%d%d",&a,&b);
for(m=a;m<=b;m=m+2) //判别m是否为素数,m由a变化到b,增量为2,把偶数先排除掉
{
prime=1; //循环开始时设168kan.5d6d.comprime为真,即先认为m为素数
k=(int)sqrt(m); //用k代表根号m的整数部分
for(i=2;i<=k;i++) //此循环的作用是将m被2-根号m除,检查是否能整除,如果m有因子,那么对它开方得其根,它的因子一定会小于k,即因子的平方会小于n
if(m%i==0) //如果能整除,表示m不是素数
{
prime=0; //使prime变为假
break; //终止执行本循环
}
if(prime) //如果m为素数
n=n+1; //n用来累计输出素数的个数
}
printf("%d\n",n); // 输出素数个数
return 0;
}
ps:上面用a、b来表示范围了,如果a到b的范围很大,用上面的效率就低了,用搜索先判断一下,缩小范围再用上面的(应该是这样的吧,用搜索的我还没做过,呵呵)
不知道上面的行不行,我也是菜鸟,希望多多指教
#include <math.h>
int main()
{
int m,k,i,n=0,a,b;
int prime; //以prime的真假来标记是否为素数
scanf("%d%d",&a,&b);
for(m=a;m<=b;m=m+2) //判别m是否为素数,m由a变化到b,增量为2,把偶数先排除掉
{
prime=1; //循环开始时设168kan.5d6d.comprime为真,即先认为m为素数
k=(int)sqrt(m); //用k代表根号m的整数部分
for(i=2;i<=k;i++) //此循环的作用是将m被2-根号m除,检查是否能整除,如果m有因子,那么对它开方得其根,它的因子一定会小于k,即因子的平方会小于n
if(m%i==0) //如果能整除,表示m不是素数
{
prime=0; //使prime变为假
break; //终止执行本循环
}
if(prime) //如果m为素数
n=n+1; //n用来累计输出素数的个数
}
printf("%d\n",n); // 输出素数个数
return 0;
}
ps:上面用a、b来表示范围了,如果a到b的范围很大,用上面的效率就低了,用搜索先判断一下,缩小范围再用上面的(应该是这样的吧,用搜索的我还没做过,呵呵)
不知道上面的行不行,我也是菜鸟,希望多多指教