DHU OJ | 進階練習 21-迴文質數 | sprintf

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章