2009年4月7日 星期二

知識+ 迴文判斷


//===================================================================
// 20090406 知識 +
// http://tw.knowledge.yahoo.com/question/question?qid=1509040602278
// 發問者 : http://tw.knowledge.yahoo.com/my/my?show=AF03564771
//===================================================================

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 尋找可接受字元: s-字串 n-索引指標 d-索引移動方向(遞增或遞減)
char find(char *s, int *n, int d)
{
while(*n>=0 && s[*n]!=0)
{
if ((s[*n]|0x20)>='a' && (s[*n]|0x20)<='z') //大小寫字母
return (s[*n]|0x20); // 回傳為小寫字元

//...可視需求在這增加接受判斷字元符號的程式碼, 如下列的數字:
if (s[*n]>='0' && s[*n]<='9') //若要忽略數字, 請移除這兩行!!
return s[*n]; // 回傳數字字元

*n += d; // 將索引遞增(或遞減), 來搜尋下一可接受字元
}
return d; //找不到可接受字元, 回傳遞增值來區分
}

int main()
{
char str[100];
int len, i, j;
while(1)
{
printf("\nEnter a string: ");
gets(str);
len = (int)strlen(str);
if (len<2) break; //若輸入小於兩個字則離開迴圈.

printf("The reverse string: ");
for(i = len-1;i >= 0;i--)
printf("%c",str[i]);

for(i=0, j=len-1; j>i; i++, j--) // i從頭找, j從尾找
if (find(str, &i, 1)!=find(str, &j, -1))
break; //若發現字元不合, 則跳離迴圈..
printf( "\n\"%s\" is%s a palindrome\n",
str, (j>i)?" not": "");
}
return 0;
}

//執行結果 :
//
//Enter a string: Gary knits a stinky rag.
//The reverse string: .gar yknits a stink yraG
//"Gary knits a stinky rag." is a palindrome
//
//Enter a string:

沒有留言:

張貼留言