基本思想:把m作为被除数,将2—INT( )作为除数,如果都除不尽,m就是素数,否则就不是。
可用以下程序段实现:
void main()
{ int m,i,k;
printf("please input a number:\n");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i if(m%i==0) break; if(i>=k) printf("该数是素数"); else printf("该数不是素数"); } 将其写成一函数,若为素数返回1,不是则返回0 int prime( m%) {int i,k; k=sqrt(m); for(i=2;i if(m%i==0) return 0; return 1; } 扩展资料: 筛法求素数 一、基本思想 用筛法求素数的基本思想是: 把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。 如有: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是: 3 5 7 9 11 13 15 17 19 21 23 25 27 29 剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为: 2 3 5 7 11 13 17 19 23 29 二、C++实现 1、算法一:令A为素数,则A*N(N>1;N为自然数)都不是素数。 #define range 2000 bool IsPrime[range+1]; /*set函数确定i是否为素数,结果储存在IsPrime[i]中,此函数在DEV C++中测试通过*/ void set(bool IsPrime[]) { int i,j; for(i=0;i<=range;++i) IsPrime[i]=true; IsPrime[0]=IsPrime[1]=false; for(i=2;i<=range;++i) { if( IsPrime[i]) { for(j=2*i;j<=range;j+=i) 2、 说明:解决这个问题的诀窍是如何安排删除的次序,使得每一个非质数都只被删除一次。 中学时学过一个因式分解定理,他说任何一个非质(合)数都可以分解成质数的连乘积。 例如,16=2^4,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小质数写在最左边,有16=2^4,18=2*9,691488=2^5 * 21609,; 换句话说,把合数N写成N=p^k * q,此时q当然是大于p的,因为p是因式分解中最小的质数。由于因式分解的唯一性,任何一个合数N,写成N=p^k * q;的方式也是唯一的。 由于q>=p的关系,因此在删除非质数时,如果已知p是质数,可以先删除p^2,p^3,p^4,... ,再删除pq,p^2*q,p^3*q,...,(q是比p大而没有被删除的数),一直到pq>N为止。 因为每个非质数都只被删除一次,可想而知,这个程序的速度一定相当快。依据Gries与Misra的文章,线性的时间,也就是与N成正比的时间就足够了(此时要找出2N的质数)。 代码如下: #include #include using namespace std; int main() { int N; cin>>N; int *Location=new int[N+1]; for(int i=0;i!=N+1;++i) Location[i]=i; Location[1]=0; //筛除部分 int p,q,end; end=sqrt((double)N)+1; for(p=2;p!=end;++p) { if(Location[p]) { for(q=p;p*q<=N;++q) { for(int k=p*q;k<=N;k*=p) Location[k]=0; } } } int m=0; for(int i=1;i!=N+1;++i) { if(Location[i]!=0) { cout< ++m; } if(m%10==0) cout< } cout< return 0; } 该代码在Visual Studio 2010 环境下测试通过。 以上两种算法在小数据下速度几乎相同。 参考资料:百度百科-筛法求素数
方法有2个:
1、判断n是否能被2~√n间的整数整除
#include
#include
int main()
{
int n,i;
double k;
scanf("%d", &n);
k = sqrt(n);
for (i = 2; i <= k;i++)
{
if (n%i == 0) break;
}
if (i <=k) printf("This is not a prime.");
else printf("This is a prime");
return 0;
}
2、判断n是否能被2~n-1整除
#include
int main()
{
int i, n;
scanf("%d", &n);
for (i = 2; i < n ; i++)
{
if (n%i == 0)
break;
}
if (i < n) printf("This is not a prime.");
else printf("This is a prime.");
return 0;
扩展资料:
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。
判断语句(选择结构):
if 语句:“如果”语句;if—else 语句:“若…(则)…否则…”语句;switch 语句:“切换”语句;switch—case:“切换—情况”语句。
循环语句(循环结构):
while 语句:“当…”语句;do—while 语句:“做…当…(时候)”语句;for 语句:条件语句(即“(做)…为了…”语句)。
跳转语句(循环结构:是否循环):
goto 语句:“转舵”语句,也称“跳转”语句;break 语句:“中断”(循环)语句,即结束整个循环;continue 语句:“继续”语句(结束本次循环,继续下一次循环);return 语句:“返回”语句。
需要说明的是:
1、一个C语言源程序可以由一个或多个源文件组成。
2、每个源文件可由一个或多个函数组成。
3、一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。是整个程序的入口。
4、源程序中可以有预处理命令(包括include 命令,ifdef、ifndef命令、define命令),预处理命令通常应放在源文件或源程序的最前面。
5、每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。(结构体、联合体、枚举型的声明的“}”后要加“ ;”。)
6、标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
书写规则
1、一个说明或一个语句占一行。
2、用{} 括起来的部分,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。
3、低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。
参考资料:百度百科-c语言
C语言中判断素数的代码如下:
#include
int is_prime(int n)
{
int i;
if(n<=1)
{
return 0;
}
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int i,n=0,t=1;
printf("1000以内的素数排列:\n");
for(i=2;i<1000;i++)
{
if(is_prime(i))
{
n++;
t++;
printf("%4d",i);
if(t>10)
{
printf("\n");
t=1;
}
}
}
printf("\n1000以内的素数共有%d个\n",n);
return 0;
}
扩展资料:
C语言中判断素数的其他代码:
#include
int main(void)
{
unsigned long num;
unsigned long div;
int isPrime;
printf("Please enter an integer for analysis. ");
printf("Enter q to quit.\n");
while(scanf("%lu", &num) == 1 && num != 1)
{
for(div = 2, isPrime = 1;(div * div) <= num; div++)
{
if(num % div == 0)
{
if((div * div) != num)
{
printf("%lu is divisible by %lu and %lu.\n", num, div, num / div);
}
else
{
printf("%lu is divisible by %lu.\n", num, div);
}
isPrime = 0;
}
}
if(isPrime == 1){
printf("%lu 是素数.\n", num);
}
printf("Please enter another integer for analysis. ");
printf("Enter q to quit.\n");
}
printf("Bye.\n");
return 0;
}
参考资料:
百度百科-C语言
方法又2个:
判断n是否能被2~√n间的整数整除
#include
#include
int main()
{
int n,i;
double k;
scanf("%d", &n);
k = sqrt(n);
for (i = 2; i <= k;i++)
{
if (n%i == 0) break;
}
if (i <=k) printf("This is not a prime.");
else printf("This is a prime");
return 0;
}
2.判断n是否能被2~n-1整除
#include
int main()
{
int i, n;
scanf("%d", &n);
for (i = 2; i < n ; i++)
{
if (n%i == 0)
break;
}
if (i < n) printf("This is not a prime.");
else printf("This is a prime.");
return 0;
}
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
请大家不要局限于找约数这样的低效算法,看看我写的这个随机化的算法,采用费马小定理,应该对大家有帮助
#include
#include
#include
int mpow( int s, int t, int m )
{
long long f, p;
if ( t == 0 )
return 1;
f = mpow( s, t >> 1, m );
if ( t & 1 )
{
p = s * f * f;
return p % m;
}
p = f * f;
return p % m;
}
int Miller_Ribin( int s )
{
int i, p;
for ( i = 0; i < 10; i++ )
{
p = rand()% ( s - 1 ) + 1;
if ( mpow( p, s - 1, s ) != 1 )
break;
}
return i == 10;
}
int main( )
{
srand( time( NULL ) );
int x;
printf("请输入数: ");
scanf("%d", &x);
if ( x < 0 )
x = -x;
if ( x <= 1 )
printf("该数不是素数\n");
else
if ( Miller_Ribin( x ) )
printf("该数是素数\n");
else
printf("该数不是素数\n");
return 0;
}