素数也叫质数,就是在大于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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。