素数也叫质数,就是在大于1的自然数中,除了1和此整数自身外,不能被其他不包括0的自然数所整除的数,
需要注意的是,判断一个自然数n是否为质数,无须从1-n检验是否都能与此数整数,只需要用少于等于根号n的所有素数与此数试除即可,这样,每个数的检验的时间复杂度,足足减少了一半。
C语言的实现代码如下:
#include<stdio.h>
#include<math.h>
void main(){
int m,n;
printf("输出从m到n的素数:\n");
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(int i=m;i<=n;i++){
int flag=1;//使用flag来控制这个素数是否输出而不是直接pass掉这个素数
for(int j=2;j<=sqrt(float(i));j++){
if((i%j)==0){
flag=0;
break;
}
}
if(flag){
printf("%d,",i);
}
}
}
运行结果如下:
如果在VS2005以上的版本可能会出现scanf的警告,warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details
在Windows环境下,不推荐用ANSI字符串类型,已经废止printf()系列函数,改用后面带_s的函数形式,采用unicode字符串。用scanf()函数接收的字符串,将有可能出错,ANSI是用0结束的字符串,但unicode字符串有些字符的第二位是0,这样scanf()就只收到0之前的那一串代码。现在的Windows,内部全部使用unicode字符串进行处理,如果你的程序强行采用ANSI字符串形式,则Windows会多做一个动作,将这些字符串转换为unicode码,在返还给你的程序时,若用printf(),又要再转回ANSI码。新型的C编译程序给出这个警告,是有道理的。一般警告类信息,可以不理睬而强行编译,也能通过,但不保证执行正常。
ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。所以vc++2005/2008中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。
这是ide的安全检查,和c语言本身没关系。scanf_s()的使用如下:
#include <stdio.h>
#include <stdafx.h>
int main()
{
int a,b,sum;
printf("请输入两个整数\n");
scanf_s("%d,%d",&a,1,&b,1);
sum=a+b;
printf("%d",sum);
return 0;
}