之前寫過逆排序的數組實現,對於經典的迴文問題卻還沒有深入研究過。今天抽空看了下,總結了兩種比較常用的迴文法。
一種是字串(當然也可以叫數組法),此方法可以用來判斷字串輸入以及INT類型的輸入
另一種是數字輸入,因為追求簡便性所以此方法只能判斷迴文數,不能判斷迴文字串。要想都判斷也很簡單,將變數類型調整即可實現
代碼以及講解如下:
/***判斷迴文數***///情況1.利用字串判斷迴文//實現方法:利用字串指標從頭尾分別判斷#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <ctype.h>//typedef char Pre_; 方便調試迴文時更改類型bool Judge_char(const char *p); //聲明一個布爾型變數的函數原型int main(int argc, char *argv[]){ printf("Please enter the chars to judge:\n"); bool re_value = 0; //初始化邏輯變數 char *k; scanf("%s", k); //聲明一個字串指標,並將STDIN傳入 re_value = Judge_char(k); if (re_value){ printf("This charset is Palindrom"); } else { printf("this charset is not Palindrom"); //判斷命題真假並輸出結果 } return 0;}bool Judge_char(const char *p){ register int i = 0; //計數變數初始化 int len = strlen(p); //使用STRLEN函數取字串數組的字元位元 //注意此處STRLEN與SIZEOF的使用方法區別,後者返回參數的所佔空間大小並包含Null 字元'\0'大小 //在STRLEN原型中傳入的參數是const指標而不是*p對象 for (i = 0; i <= len; i++) { if (p[i] == p[len - 1]) { len--; //若首尾兩個字元等值,分別向字串中心移動一位,並判斷 } else return false; } return true;}
//情況2.判斷數字迴文//利用數位數值方法進行迴文判斷#include <stdio.h>#include <stdlib.h>#include <stdbool.h>//此方法可以直接嵌入main函數中,不需要聲明自訂函數int main(int argc, char *argv[]){ printf("Please enter the number to judge:\n"); int Inp; //將INP作為一個儲存初始變數的整型,用於迴圈後的判斷 scanf("%d", &Inp); //將STDIN格式化傳入INP中,舉個例子Inp = 1234 int sum = 0; int Calcul; Calcul = Inp; //聲明另一個CALCUL變數並將初始值賦給它,其在迴圈中將會用以判斷並發生改變 while(Calcul != false) { sum = sum * 10 + Calcul % 10;//第一次等式為sum=0*10+1234%10(其實值就是4)=4, //第二次等式為sum=4*10+123%10(其實值為3)=43,第三次等式為sum=43*10+12%10=432 //第四次sum=432*10+1%10(其實為1)=4321 Calcul /= 10;//第一次等式為Calcul=1234/10=123第二次Calcul=123/10=12第三次Calcul=12/10=1,第四次Calcul=1/10=0; } if (sum == Inp) { printf("this is a palindrome"); } else{printf("this is not a palindrome"); } return 0;}