素数是只能被1和它本身整除的
数。
实现代码:
#include
int
main(void)
{
int
i,
n
=
2;
printf("请输入一个数:\n");
scanf("%d",
&i);
while
(1)
{
if
(i%n
==
0)
{
break;
}
n++;
}
if
(n
==
i)
{
printf("这个数是素数!");
}
else
{
printf("这个数不是素数!");
}
return
0;
}
素数,也叫质数,就是指除了1和该数本身以外,不能被其他任何整数整除的正数。
#include<stdioh>#include<mathh>void main(){ int m, k, i, n=0; for(m=1; m <= 200; m=m+2) { k = sqrt(m); for(i=2; i <= k; i++) if(m % i == 0) break; if(i >= k + 1) { printf("%5d",m); n = n + 1;素数
所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。因此判断一个整数m是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数
另外判断方法还可以简化。m不必呗2~m-1之间的每一个整数去除,只需被2~√m之间的每一个整数去除就可以了。如果m不能被2~√m间任一整数整除,m必定是素数。例如判别17是是否为素数,只需使17被2~4之间的每一个整数去除,由于都不能整除,可以判定17是素数。(原因:因为如果m能被2~m-1之间任一整数整除,其二个因子必定有一个小于或等于√m,另一个大于或等于√m。例如16能被2,4,8整除,16=28,2小于4,8大于4,16=44,4=√16,因此只需判定在2~4之间有无因子即可)
以下是求1到20的素数的C语言程序:
```c
#include <stdioh>
int main() {
int i, j, flag;
printf("1-20的素数有:");
for (i = 2; i <= 20; i++) {
flag = 0;
for (j = 2; j <= i/2; j++) {
if (i%j == 0) {
flag = 1;
break;
}
}
if (flag == 0 && i != 1) {
printf("%d ", i);
}
}
return 0;
}
```
程序的主要思路是使用两层循环,外层循环遍历1到20之间的整数,内层循环遍历当前数除去1和自身后的所有数,判断是否有整除的情况。如果存在因子,则说明该数不是素数,将标志位flag置为1,跳出内层循环。如果内层循环遍历完毕后,flag仍等于0,则说明该数是素数,将其输出即可。需要注意的是,1不是质数。
输出结果为:
```
1-20的素数有:2 3 5 7 11 13 17 19
```
基本思想:把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<k;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<k;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为素数,则AN(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=2i;j<=range;j+=i)
IsPrime[j]=false;}}}2、
说明:解决这个问题的诀窍是如何安排删除的次序,使得每一个非质数都只被删除一次。 中学时学过一个因式分解定理,他说任何一个非质(合)数都可以分解成质数的连乘积。
例如,16=2^4,18=2 3^2,691488=2^5 3^2 7^4等。如果把因式分解中最小质数写在最左边,有16=2^4,18=29,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^2q,p^3q,,(q是比p大而没有被删除的数),一直到pq>N为止。
因为每个非质数都只被删除一次,可想而知,这个程序的速度一定相当快。依据Gries与Misra的文章,线性的时间,也就是与N成正比的时间就足够了(此时要找出2N的质数)。
代码如下:
#include<iostream>
#include<cmath>
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;pq<=N;++q)
{
for(int k=pq;k<=N;k=p)
Location[k]=0;
}
}
}
int m=0;
for(int i=1;i!=N+1;++i)
{
if(Location[i]!=0)
{
cout<<Location[i]<<" ";
++m;
}
if(m%10==0) cout<<endl;
}
cout<<endl<<m<<endl;
return 0;
}
该代码在Visual Studio 2010 环境下测试通过。
以上两种算法在小数据下速度几乎相同。
参考资料:
#include <stdioh>
int main()
{
int a=0;
int num=0;
int i;
printf("输入一个整数:");
scanf("%d",&num);
for(i=2;i<num;i++){
if(num%i==0){
a++;
}
}
if(a==0){
printf("%d是素数。\n", num);
}else{
printf("%d不是素数。\n", num);
}
return 0;
}
扩展资料:
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
基本算法:若 k%m==0 则说明 k 不是素数。
判断整数n是否为素数——采用枚举法求解。
采用枚举算法解题的基本思路:
(1)确定枚举对象、枚举范围和判定条件;
(2)枚举可能的解,验证是否是问题的解。
枚举算法的一般结构:while循环。
参考资料来源:百度百科-枚举法
你的C语言求素数的程序我帮你改完了(仅两处错误),你看看吧(改动的地方见注释)
#include<stdioh>#include<mathh>
int main()
{
int n,i=1;
int r;//这里float r;改成int r;因为整数除以整数所得余数还是整数
printf("input a number n=");
scanf("%d",&n);
for(i=2;i<=n-1;)
{
r=n%i;
if(r==0)
{
printf("%d不是素数\n",n);
return 0;
}
else
{
i=i+1;
if(i>sqrt(n))
{
printf("%d是素数\n",n);
return 0;
}
//else//这里去掉else语句块,因为如果i>sqrt(n)n就是素数,如果i<sqrt(n)应该让程序自动执行下去
//{
//return(n);
//}
}
}
}
除2以外,素数皆为奇数,所以对2单独处理,从3开始,将100以内的奇数逐一进行素数考察,是则输出,不是则跳过。另设一计数变量控制换行,每输出5个素数添加一个回车。代码如下:
#include "stdioh"
int main(int argc,char argv[]){
int i,n,t;
pr
#include
#include
main()
{
int a,i,flag,count=0;
for(a=1;a <=100;a++)
{
flag=0;
for(i=2;i
#include int main()
{
int i,n,k,b;
for(i=1,b=1;i<=100;i++)
{
for(n=2;n {
k=i%n;
if(k==0)
break;
}
扩展资料:
C语言注意事项:
1、预编译命令不是语言语句,不使用分号,不占用运行时间。
2、在IDE中通常包括编辑器,编译器,汇编器和链接器,在这个过程中是语言等级逐级降低的过程,从最高级的c语言到中级语言汇编语言再到低级语言机器语言,编辑器生成文件为c文件,编译器生成的文件为obj汇编器生成的文件为0文件,链接器生成的是exe文件。
3、注意 return和exit的区别, return是让本函数运行结束,而exit是让本程序运行结束。
4、在指针定义时,一定要进行初始化,否则就会出现意想不到的错误,如果不能找到对应地址赋值,那就赋给NULL(注意大写)。
5、gets可以 scanf办成办不成的事,就是可以接受空格,puts在最后会输出一个换行。
以上就是关于C语言中的素数是什么意思全部的内容,包括:C语言中的素数是什么意思、素数的C语言程序怎么做、c语言程序设计 求1到20的素数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)