关于如何判断一个和数是否是质数相除而得
在此之前,虽然判断质数的方法已经人尽皆知,CSDN中也有很多论述如何用c判断一个数是否为质数的文章,但是我还是再次简单的提一下,质数判断的主流方法是用一个数除以2到他的平方根,如果这中间没有一个数被除尽,那么这个数即为质数。
#include <stdio.h>
#include <math.h>
int main(void)//判断一个数是否为质数,只需要用这个数依次除以2到这个数的平方根(因为两个公因数必定一大一小,极限时恰为平方根),若除不尽,则为质数。
{
int n,cishu, quyu;//cishu表示质数运算的被除数,_n表示n的平方根
double _n;
int jieguo=1;//表示结果
scanf_s("%d", &n);
_n = (int)sqrt(n);//求平方根
/*printf("%lf\n", _n);*/
for (cishu = 2; cishu <= _n; cishu++ )
{
quyu = n % cishu;
if (quyu == 0)
{
printf("N");
jieguo = 0;
break;
}
}
if (jieguo==1)
printf("Y");
return 0;
}
以上就是判断一个数是否为质数的一个程序,而要判断一个和数是否为质数的直接后代(由两个相乘而得),也可以利用这种判断方法。
思路是:先利用合数除以一个质数,并储存其结果,然后利用结果是否为质数来判断,以下是具体的程序代码:
#include <stdio.h>
#include <math.h>
int main(void)//程序思路:先利用检测数来除一个质数,若除尽,再判断结果是否为质数
{
int zhishu,jieguo,shibie=1,_shibie, n,jianceshu,cishu,cishu2,cishu3,panduan1=0,panduan2=0,zuizhongjieguo=0;
int zhishu2,pinfanggen;
int pinfanggen2;
//scanf_s("%d", &n);//n表示下方要检测的数据个数(现在未启用)
//for (cishu = 0; cishu <= n; cishu++)//
//{
scanf_s("%d", &jianceshu);
for (zhishu = 3; zhishu <= 5000; zhishu++)//计算5000以内的所有质数,不要从2开始调用,因为容易发生冲突。
{
//zuizhongjieguo = 0;//让每次运算zuizhongjieguo初始值相同
pinfanggen = (int)sqrt(zhishu)+1;//求质数的平方根
shibie = 1;
for (cishu2 =2; cishu2 <= pinfanggen; cishu2 ++)//质数判断过程
{
jieguo = zhishu % cishu2;
//目的是让每个质数所取得的panduan2值相互独立
if (jieguo == 0)//若除尽,则不是质数,不再运算
{
shibie = 0;
break;
}
}
jieguo = jianceshu % 2;
if (jieguo == 0)
{
panduan2 = jianceshu / 2;//为了补全没有质数2冲突的情况
if (panduan2 == 2 && zuizhongjieguo==0)//同理,补充没有质数2的情况
{
printf("Yes");
zuizhongjieguo = 1;
}
for (zhishu2 = 3; zhishu2 <= 5000; zhishu2++)//调用5000以内的质数,方法同上,一样要注意2会发生冲突
{
pinfanggen2 = (int)sqrt(zhishu2) + 1;//目的是防止2时开方结果为1
_shibie = 1;//先假定为质数
for (cishu3 = 2; cishu3 <= pinfanggen2; cishu3++)
{
jieguo = zhishu2 % cishu3;//用余数是否为0来判断质数,这里调用了上一次的变量储存
if (jieguo == 0)
{
_shibie = 0;
break;
}
}
if (_shibie == 1 && panduan2 == zhishu2 && panduan1 == 0)//前一个条件判断质数,后一个判断为两个质数相乘而得
{
printf("Yes");//输出Yes
zuizhongjieguo = 1;
panduan1 = 1;
break;
}
}//2的情况完毕
}
if (shibie ==1 && zuizhongjieguo==0)//用质数2未判断成功的情况
{
panduan1 = jianceshu %zhishu;
if (panduan1 ==0)//如果除尽,则继续判断结果是否为质数
{
panduan2 = jianceshu / zhishu;//用panduan2储存商值
}
for (zhishu2 = 3; zhishu2 <=5000; zhishu2++)//调用5000以内的质数,方法同上
{
pinfanggen2 = (int)sqrt(zhishu2)+1;//目的是防止2时开方结果为1
_shibie = 1;//先假定为质数
for (cishu3 = 2; cishu3 <= pinfanggen2; cishu3++)
{
jieguo = zhishu2 % cishu3;//用余数是否为0来判断质数,这里调用了上一次的变量储存
if (jieguo == 0)
{
_shibie = 0;
break;
}
}
if (_shibie == 1 && panduan2 == zhishu2)//前一个条件判断质数,后一个判断为两个质数相乘而得
{
printf("Yes");//输出Yes
zuizhongjieguo = 1;
break;
}
}
}
}
if (zuizhongjieguo == 0)//判断不是质数后代
{
printf("No");
}
//}
return 0;
}
这样一来,就可以顺利的判断一个合数是否为质数的直接后代了。