序:對于一個循環小數,我們用 ’……‘ 表示一個循環節,例如:1/3=0.3333……,記作:1/3=0.’3’;1/6=0.1666……,記作:1/6=0.1’6’;1/7=0.142857142857……,記作:1/7=0.’142857’.
一、例子:
1/7=0.’142857’,其循環節有6位,7是素數且7-6=1;
1/17=0.’0588235294117647’,其循環節有16位,17是素數且17-16=1;
1/19=0.’052631578947368421’,其循環節有18位,19是素數且19-18=1;
1/23=0.’0434782608695652173913’,其循環節有22位,23是素數且23-22=1;
1/29=0.’0344827586206896551724137931’,其循環節有28位,29是素數且29-28=1;
……………………………………………………
經過檢驗在10^7即一千萬以内,共有222531個符合以上規律的數,它們都是素數,也就是:在一千萬以内共有222531個全循環素數。
二、結論:
由此得到猜想:n是一個不能被5整除的奇數,n的倒數必是一個純無限循環小數,如果它的循環節有n-1位,那麼n一定是素數。由于n的循環節位數隻比它本身小1并且n是素數,我們就把這樣的數n叫做全循環素數。
三、檢驗展示:
四、檢驗程序:
//檢驗全循環素數:
#include <stdio.h>
#include <math.h> /*包含數學函數*/
int main ()
//先找出小于(2^31-1)的平方根的質數存入數組z[]
{ int z[4793]={2,3},g=1,i,x,q; //因46349以内共有素數4793個
for(i=5;i<=46349;i =2) //因46349的平方>2的31次方
{ x=1;q=sqrt(i); //每次都從第一個素數開始檢驗
while(i%z[x]!=0)
{ if(z[x]>q){g ;z[g]=i;break;} //i是素數時:累加素數個數,存儲,退出内循環
x ; //不确定時用下一個素數檢驗
}
}
int m,n,b,y,w,hg=0; //被除數b,餘數y,循環節位數w,合數個數hg
g=0;
printf("請輸入奇數範圍[m,n](用空格隔開):"); scanf("%d %d",&m,&n);
if(m%2==0) m ; //保證m從奇數開始
for(i=m;i<=n;i =2)
{ if(i%5!=0) //排除5的倍數
{ b=10;w=0;y=1; //被除數從10起,循環節位數置0,餘數置1
while (b>1) //當被除數不為1時(反複除直到餘數即被除數再次為1止):
{ y*=10; y%=i; //餘數*10變為被除數,求新的餘數
w ; b=y; //循環節位數加1,餘數給被除數
}
if(i-w==1) //若是全循環素數時:(如果改用i%w==1,則可檢驗部分循環素數)
{ g ; printf(" %d",i); //素數個數加1,輸出該數
x=1;q=sqrt(i); //每次都從第一個素數開始檢驗
while(z[x]<=q) //不能确定是素數時一直檢驗,直到确定是素數為止
{ if(i%z[x] ==0){ hg ; printf("%d不是素數\n",i);break;} //是合數時累加合數個數,退出循環
x ; //不能确定時用下一個素數檢驗
}
}
}
}
printf("\n[%d,%d]以内共有以上%d個全循環素數,其中有%d個不是素數",m,n,g-hg,hg);
}
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!