再來(lái)分析第5、第6步,怎樣判斷一個(gè)數(shù)是不是素?cái)?shù)呢?
素?cái)?shù)就是除了1和它自身外,不能被任何數(shù)整除的整數(shù),由定義可知:
2、3、5、7、11、13、17、19等是素?cái)?shù);
1、4、6、8、9、10、12、14等不是素?cái)?shù);
要判斷i是否是素?cái)?shù),最簡(jiǎn)單的辦法是用2、3、4、⋯⋯i-1這些數(shù)依次去除i,看能否除盡,若被其中之一除盡,則i不是素?cái)?shù),反之,i是素?cái)?shù)。
但其實(shí),沒(méi)必要用那么多的數(shù)去除,實(shí)際上,用反證法很容易證明,如果小于等于i的平方根的數(shù)都除不盡,則i必是素?cái)?shù)。于是,上述算法中的第5步、第6步可以細(xì)化為:
第5)步p是素?cái)?shù)嗎?
flag p=1;
for(j=2;j<=[sqrt(p)];j++)
ifp除以j的余數(shù)=0
{flag p=0;
break;}
第6)步q是素?cái)?shù)嗎?
flag q=1;
for(j=2;j<=[sqrt(q)];j++)
ifq除以j的余數(shù)=0
{flag q=0;
break;}
程序如下:
#include<math.h>
#include<stdio.h>
main()
{
intj,n,p,q,flag p,flag q;
printf("please input n:");
scanf("%d",&n);
if(((n%2)!=0)||(n<=4))
printf("inputdataerror!\n");
else
{
p=1;
do{
p=p+1;
q=n-p;
flag p=1;
for(j=2;j<=(int)(floor(sqrt((double)(p))));j++)
{
if((p%j)==0)
{
flag p=0;
break;
}
}
flag q=1;
for(j=2;j<=(int)(floor(sqrt((double)(q))));j++)
{
if((q%j)==0)
{
flag q=0;
break;
}
}
}while(flag p*flag q==0);
printf("%d=%d+%d\n,"n,p,q);
}
}
程序運(yùn)行結(jié)果如下:
RUN¿
please input n:8
8=3+5
RUN
please input n:98
98=19+79
RUN
please input n:9
input data error!