目录
前序
这里我们主要讲关于素数的一系列题目,有入门也有进阶的题目,题目难度是循序渐进的,只要一步步看懂,我相信做会这些题目并不需要多少时间
储备知识
首先我们先理解一下素数的概念
素数(或质数)是指一个大于1的自然数n,在2~n-1或者2~根号n的范围内不能被整除的数
在这里特别强调一下1不是素数
一:素数(入门)
判断一个数是否为素数
输入描述
一个大于1且小于100000000的整数m。
输出描述
-
如果m不在规定的数值范围(大于1且小于100000000)之内,则输出“input error!”;
-
如果m是素数,输出“prime”,否则请输出“not prime”。
样例输入
10000019
样例输出
prime
源代码
#include<stdio.h>
#include<math.h>
int main()
{
unsigned long x,y;
double z;
y=2;
scanf("%lu",&x);
z=sqrt(x);
//根据定义来判断这个数是否为素数
while(y <= z)
{
if(x%y==0)
{
printf("not prime");
break;
}
else
y++;
}
//若没有跳出循环,则这个数为素数
if(y>z)
printf("prime");
return 0;
}
二:素数以及逆序的综合利用(基础)
1.绝对素数
题目描述
如果一个两位数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13,试编程求出所有两位数中的绝对素数。
输入
无
输出
若干行,每行一个绝对素数,从小到大输出
源代码
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,l,m;
for(i=10;i<=99;i++)
{
//判断一个数是否为素数
k=sqrt(i);
for(j=2;j<=k;j++)
{
if(i%j==0)
{
break;
}
}
//若这个数没有跳出循环,证明这个数是素数
if(j>k)
{
//接下来这一步相当于把这个两位数逆序
l=i%10*10+i/10;
//再一次判断这个逆序了的数是否为素数
for(m=2;m<=sqrt(l);m++)
{
if(l%m==0)
{
break;
}
}
if(m>sqrt(l))
{
printf("%d\n",i);
}
}
}
}
2.素数回文数
提示
这个题目和上面一个题目其主要步骤是差不多的,都是判断是否为素数以及逆序这个数,只不过这个题稍微难一点点
题目描述
如果一个数从左边读和右边读都是同一个数,就称为回文数,例如686就是一个回文数。编程求10到1000内所有的既是回文数同时又是素数的自然数。
输入
无
输出
若干个数 每行一个
源代码
#include<stdio.h>
#include<math.h>
int main()
{
int i,k,j;
int b,c;
for(i=10;i<=1000;i++)
{
k=sqrt(i);
for(j=2;j<=k;j++)
{
if(i%j==0)
{
break;
}
}
if(j>k)
{
b=i;
c=0;
//以上都和前面的题目操作不能说相似,只能说一模一样!!!
//这个题目的不同之处在于下面4行
while(b>0)
{
//这里很巧妙,将每次的末数*10,从而达到将这个数一步一步向前推的效果
c=c*10+b%10;
//每次除以10,减少一位,方便一步一步取余
b=b/10;
}
}
//若这个数逆序和正序一样,那这个数就是回文数
if(c==i)
{
printf("%d\n",i);
}
}
}
二和三都是差不多的做法,而下面的四和五是差别挺大
三:素数和数组的综合利用(进阶)
1.歌德巴赫猜想
题目描述
任一个大于等于4的偶数都可以拆分为两个素数之和。
输入
一个整数n( 4 <= n <= 200 )
输出
将小于等于n的偶数拆分为2个质数之和,列出所有方案!
样例输入
10
样例输出
4=2+2
6=3+3
8=3+5
10=3+7
10=5+5
源代码
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
//采用数组储存素数,会更方便
int arr[n];
int a=0;
int j;
for(int i=2;i<=n;i++)
{
int k=sqrt(i);
for(j=2;j<=k;j++)
{
if(i%j==0)
{
break;
}
}
if(j>k)
{
//这里注意一点要自加,不然数组不移动
arr[a++]=i;
}
}
int l;
for(l=1;l<=n;l++)
{
//根据题目要求,先判断其是否为偶数
if(l%2==0)
{
//用二重循环,判断是否满足条件
for(int i=0;i<a;i++)
{
for(int k=0;k<a;k++)
{
//注意除了相加要等于偶数以外,一定要多后面的判断,不然会出现,重复的情况
if(arr[i]+arr[k]==l&&arr[i]<=arr[k])
{
printf("%d=%d+%d\n",l,arr[i],arr[k]);
}
}
}
}
}
}
2.素数对
孪生素数是指间隔为2的两个相邻素数,因为它们之间的距离已经近得不能再近了,如同孪生兄弟一样,故将这一对素数称为孪生素数。
例如(3,5),(5,7),(11,13)等
输入格式:
在一行输入2个正整数m和n 求两个数之间的所有孪生素数
输出格式:
若该区间有:则输出形如(3,5)素数对,一行输出一对,在最后一行统计输出共有几对孪生素数
若区间没有:输出“没有找到”
输入样例1:
2 20
输出样例1:
(3,5)
(5,7)
(11,13)
(17,19)
共找到4对孪生素数
输入样例2:
18 25
输出样例2:
没有找到
源代码
#include<stdio.h>
#include<math.h>
int main()
{
int m,n;
scanf("%d %d",&m,&n);
//注意输入两个数的大小,题目并没有给出,所以一定要判断哪个数更大
int max,min;
max=m>n?m:n;
min=m<n?m:n;
int arr[max];
int i,j,k;
int a,c;
a=0;c=0;
for(i=min;i<=max;i++)
{
k=sqrt(i);
for(j=2;j<=k;j++)
{
if(i%j==0)
{
break;
}
}
if(j>k)
{
arr[a++]=i;
}
}
//上面内容都跟上一题一模一样
//不同点在下面
for(i=0;i<a-1;i++)
{
//判断后面一个数是否比前面一个数大2
if(arr[i+1]==arr[i]+2)
{
printf("(%d,%d)\n",arr[i],arr[i+1]);
c++;
}
}
//判断c的值从而判断是否存在素数对
if(c>0)
printf("共找到%d对孪生素数",c);
else if(c==0)
printf("没有找到");
}
结尾
以上则是文章所有内容,希望能对你有所帮助,记得坚持做题!!!