給定一組連續的整數(例如2到100000),要求輸出所有回文素數,大致思路有以下兩種:
第一,先判斷是否素數,再判斷是否回文(不推薦)。如果是指定列舉從2到某個數范圍內的回文素數,可以考慮先用篩選法(http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html)挑選出所有素數,然后利用翻轉法逐個判斷是否回文,翻轉法如下:
bool check(long a)


{
long b=0,temp=a; //用b保存逆轉后的數,temp保存輸入的值,最后用來和b比較
while(a>0)

{ //把a的值自右向左逐位取出,自左至右地加到b上
b*=10;
b+=a%10;
a/=10;
}
return b==temp; //若相等則返回true.
}
第二,先構造回文,再判斷是否素數(推薦)??梢韵葮嬙焖谢匚乃財?,然后根據判斷是否素數(http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html)。構造回文素數的方法又有兩種:
(1)
三位回文數公式如下:
for(a[0]=1;a[0]<10;a[0]+=2)
for(a[1]=0;a[1]<10;a[1]++)
n=101*a[0]+10*a[1];
五位回文數公式如下:
for(a[0]=1;a[0]<10;a[0]+=2)
for(a[1]=0;a[1]<10;a[1]++)
for(a[2]=0;a[2]<10;a[2]++)
n=a[0]*10001+a[1]*1010+a[2]*100;
注意,偶數個位的回文素數必然是合數,因為可以被11整除(11除外),且各位是偶數的回文素數也必然是合數,因為可以被2整除。
(2)
使用枚舉+翻轉的方法,例如12翻轉后變成121,123翻轉后變成12321,務必保持奇數個位,且最高位是偶數的話不必翻轉即可判斷為合數。
int Make(int data)


{
int result;
result = data;
while((data /= 10) != 0)

{
result = result * 10 + data % 10;
}
return result;
}
第一,先判斷是否素數,再判斷是否回文(不推薦)。如果是指定列舉從2到某個數范圍內的回文素數,可以考慮先用篩選法(http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html)挑選出所有素數,然后利用翻轉法逐個判斷是否回文,翻轉法如下:















第二,先構造回文,再判斷是否素數(推薦)??梢韵葮嬙焖谢匚乃財?,然后根據判斷是否素數(http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html)。構造回文素數的方法又有兩種:
(1)
三位回文數公式如下:
for(a[0]=1;a[0]<10;a[0]+=2)
for(a[1]=0;a[1]<10;a[1]++)
n=101*a[0]+10*a[1];
五位回文數公式如下:
for(a[0]=1;a[0]<10;a[0]+=2)
for(a[1]=0;a[1]<10;a[1]++)
for(a[2]=0;a[2]<10;a[2]++)
n=a[0]*10001+a[1]*1010+a[2]*100;
注意,偶數個位的回文素數必然是合數,因為可以被11整除(11除外),且各位是偶數的回文素數也必然是合數,因為可以被2整除。
(2)
使用枚舉+翻轉的方法,例如12翻轉后變成121,123翻轉后變成12321,務必保持奇數個位,且最高位是偶數的話不必翻轉即可判斷為合數。















