目录:
- 判断一个素数
- 统计素数个数
- 输出范围素数
一、判断一个素数
素数 :
只有1和本身两个因数,又称质数
注意:1不是素数,2是素数
合数 :
除1和它本身外,还有其它的因数。
问题:
输入一个大于3的整数n,判断它是否为素数(prime,又称质数)。
采用算法:
第一种:n % i( i 取值 2~n-1 )
第二种:n % i( i 取值 2~n/2 )
原因:n的最大因数 小于或等于 n/2
第三种:n % i( i 取值 2~根号n)
原因:n的每一对因子,必然有一个小于根号n,另一个大于根号n
程序1…………i<根号n………………
#include<stdio.h>
#include<math.h> //引用平方根sqrt
int main()
{
int n,k,i;
printf("请输入一个大于3的整数:");
scanf("%d",&n);
k=sqrt(n); //求n的平方根
for(i=2;i<=k;i++)
if(n%i==0) break;
if(i<k+1) //括号内可以写成i<=k,但不能写成i<k (当n=6、8、9等时结果不对)
printf("%d不是一个素数\n",n);
else
printf("%d是一个素数\n",n);
return 0;
}
运行结果…………………………
程序2…………2~n-1……………………
#include<stdio.h>
int main()
{
int n,k,i;
printf("请输入一个大于3的正整数 n=");
scanf("%d",&n);
for(i=2;i<n;i++) //可将n换成n/2
if(n%i==0) break;
if(i<n) //可将n换成n/2
printf("%d不是素数\n",n);
else
printf("%d是素数\n",n);
return 0;
}
运行结果…………………………
二、统计素数个数
问题:求50以内的素数的个数
程序1…………………………
#include<stdio.h> //引用平方根sqrt
#include<math.h>
int main()
{
int i,n,k;
int sum=0,count=0;
printf("求[0,50]之间素数的个数:\n\n");
for(n=2;n<=50;n++)
{
k=sqrt(n); //求n的平方根
for(i=2;i<=k;i++)
if(n%i==0) break;
if(i>=k+1)
count++;
}
printf("素数个数:count=%d个\n",count);
return 0;
}
运行结果…………………………
程序2…………………………
这个程序没有用math函数,但是里面有一些细节需要我们注意:
#include<stdio.h>
int main()
{
int m,k,flag,count=0; //count=0需在开头定义中赋值
for(m=2;m<=50;m++)
{
flag=1; //可以在本行和开头定义是同时对flag赋值,但不可以只在开头时定义flag=1
for(k=2;k<m;k++)
if(m%k==0)
{
flag=0;
break;
}
if(flag) //可将 flag 换成 flag!=0
count++;
}
printf("50以内素数个数count=%d\n",count);
return 0;
}
三、输出范围素数
问题:求100~200的全部素数
程序…………………………
#include<stdio.h>
#include<math.h>
int main()
{
int i,n,k,m=0;
printf("输出[100,200]之间的全部素数:\n\n");
for(n=101;n<=200;n=n+2)
{
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0) break;
if(i>=k+1)
{
printf("%d ",n);
m++;
}
if(m%10==0)
printf("\n");
}
printf("\n");
return 0;
}
运行结果…………………………
程序2…………………………
#include<stdio.h>
#include<math.h>
int main()
{
int i,n,k;
int sum=0,count=0;
printf("求[19,101]之间的素数之和、素数的个数:\n\n");
for(n=19;n<=101;n++)
{
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0) break;
if(i>=k+1)
{
sum=sum+n;
count++;
}
}
printf("素数之和:sum=%d\n",sum);
printf("素数个数:count=%d个\n",count);
return 0;
}
运行结果…………………………
在统计和求和可输出全部素数:
如果输出内容多的话可以加上换行:
#include<stdio.h>
#include<math.h>
int main()
{
int i,n,k,m=0;
int sum=0,count=0;
printf("求[19,101]之间的素数之和、素数的个数:\n\n");
for(n=19;n<=101;n++)
{
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0) break;
if(i>=k+1)
{
sum=sum+n;
count++;
printf("%d ",n);
m++;
}
if(m%10==0)
printf("\n");
}
printf("\n\n素数之和:sum=%d\n",sum);
printf("素数个数:count=%d个\n",count);
return 0;
}
运行结果……………………
其它:
C语言与计算机语言(内含Hello world!详解)
完数 (判断、范围输出)
水仙花数(输出全部水仙花数)
判断闰年的3种方法(判断+范围输出)