判断质数
#include<stdio.h>
#include<math.h>
int isprime(int i)
{
if(i==1) //1不是质数
return 0;
int x,j;
x=sqrt(i); //对i开根号
for(j=2;j<=x;j++)
{
if(i%j==0) //如果可以取余说明不是质数
return 0;
}
return 1;
}
int main()
{
int i,j;
scanf("%d",&i); //输入数字
j=isprime(i);
if(j==0)
{
printf("不是质数");
}
else{
printf("质数");
}
return 0;
}
筛法打质数表
#include<stdio.h>
#define MAX 100 //定义最大查询质数范围
//核心思想就是先去掉关于2的倍数,再去掉关于3的倍数...
void getprime()
{
int flag[MAX]; //flag数组用于标记是否为质数,1代表是质数,0代表不是质数
int prime[MAX]; //prime数组用于存储质数
int i,j,cnt=0;
flag[0]=flag[1]=0; //0和1不是质数
for(i=2;i<MAX;i++) flag[i]=1; //假设从2开始的数都是质数
for(i=2;i<MAX;i++)
{
if(flag[i])
{
prime[cnt++]=i; //记录质数在prime数组中
for(j=2*i;j<MAX;j+=i) //去除掉关于i可以整除的数
flag[j]=0;
}
}
for(i=0;i<cnt;i++)
printf("%d ",prime[i]);
}
int main()
{
getprime();
return 0;
}
分解质因数
每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。
#include<stdio.h>
#include<math.h>
#define MAX 100 //代表最多存储多少个质数
static int prime[MAX]; //c语言不支持直接返回数组,但是可以定义局部的static
void getprime(int n)
{
int flag[n]; //flag数组用于标记是否为质数,1代表是质数,0代表不是质数
int i,j,cnt=0;
flag[0]=flag[1]=0; //0和1不是质数
for(i=2;i<n;i++) flag[i]=1; //假设从2开始的数都是质数
for(i=2;i<n;i++)
{
if(flag[i])
{
prime[cnt++]=i; //记录质数在prime数组中
for(j=2*i;j<n;j+=i) //去除掉关于i可以整除的数
flag[j]=0;
}
}
for(i=0;i<cnt;i++)
printf("%d ",prime[i]);
}
static int a[MAX]; //数组a用来存储分解出来的质数
int pdec(int n)
{
int x=sqrt(n); //对n开根号
int cnt=0; //cnt用于改变a数组下标
for(int i=1;prime[i]<=x;i++)
{
if(n%prime[i]==0) //当n可以被prime[i]整除
{
a[cnt++]=prime[i]; //记录进数组a中
n/=prime[i]; //用n出去prime[i]这个数
i--; //重新遍历i这个数,防止如9=3x3的情况
}
}
if(n!=1) //当合数不存在质因数情况
{
a[cnt++]=n;
}
return cnt; //返回数组a的下标
}
int main()
{
int i,cnt;
scanf("%d",&i);
getprime(i);
cnt=pdec(i);
printf("\n");
for(int j=0;j<cnt;j++)
printf("%d ",a[j]);
return 0;
}