21 迴文質數
作者: xxx時間限制: 1S章節: 循環
問題描述 :
因爲151既是一個質數又是一個迴文數(從左到右和從右到左是看一樣的),所以 151 號是迴文質數。寫一個程序來找出範圍[a,b](5<= a < b <= 100,000)間的所有迴文質數
輸入說明 :
僅 1 行: 二個整數 a 和 b(5<= a < b <= 100,000)。
輸出說明 :
輸出一個迴文質數的列表,一行一個。
每行首尾無空格,最後無空行。
輸入範例 :
300 500
輸出範例:
313
353
373
383
筆記
這題有兩個考點,一個是質數,一個是迴文。
質數
關於質數的題,在基礎練習中有很多,比如說:基本練習-24 素數,這篇博文中講述了質數的定義以及基本求法。
現將判斷是否是質數的代碼引述如下:
int is_prime(int a){
int i;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
break;
}
}
if(i<=sqrt(a)){
return 0;
}else{
return 1;
}
}
由於本題是單點測試(及每個測試用例中都僅包含一組測試數據),就不需要提前打表了,遍歷時直接判斷即可。
迴文
迴文的題,在基礎練習中也做過許多,但基本都是基於字符串背景的。
雖然但是,這回題幹那了一堆數字要你判斷是否迴文。
如果從數學思維出發,操作起來好像有點麻煩。但如果將待判斷數字轉換爲字符串,那不就so easy了。
那麼,如何轉化呢?
這裏用到一個字符串格式化函數:sprintf。
sprintf有點像擴展的printf(並不是,但可以這麼理解),可以通過格式控制字符串,將任一數據類型的變量輸出爲字符串。
函數聲明:int sprintf(char *string, char *format [,argument,...])
返回值:int 結果字符串的長度,不含末尾\0
頭文件:stdio.h
功能:把格式化的數據寫入某個字符串中
示例,將int型變量a輸出到字符串buffer:
char buffer[100];
int a = 58;
int len;
len = sprintf(buffer,"%d",a);
printf("buffer=\"%s\", length=%d",buffer,len);
上述代碼的打印結果爲:
buffer="58", length=2
代碼
#include<stdio.h>
#include<math.h>
int is_prime(int a){
int i;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
break;
}
}
if(i<=sqrt(a)){
return 0;
}else{
return 1;
}
}
int is_pali(int a){
char buffer[10];
int len = -1;
//將整型變量輸出爲字符串,注意別讓buffer溢出了
len = sprintf(buffer,"%d",a);
int i;
for(i=0;i<len/2;i++){
if(buffer[i]-'0' != buffer[len-i-1]-'0'){
break;
}
}
if(i<len/2){
return 0;
}else{
return 1;
}
}
int main(){
int a,b;
scanf("%d %d",&a,&b);
int i;
int flag = 1;
for(i=a;i<=b;i++){
if(is_prime(i) && is_pali(i)){
if(flag){
flag = 0;
}else{
printf("\n");
}
printf("%d",i);
}
}
return 0;
}