Trochę niepotrzebne angażowanie matematyki do tak prostego zagadnienia:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAX 30
bool Palindrom(const char *tab)
{
const char * last = tab + strlen(tab) - 1;
while(tab < last)
{
if(*(tab++) != *(last--)) {
return false; // Jeśli nie palindrom, zwróć false
}
}
return true;
}
int main(void)
{
unsigned n;
char slowo[MAX];
scanf(" %d", &n);
for (unsigned i = 0; i < n; ++i) {
scanf("%s", slowo);
if (Palindrom(slowo)) {
printf("%s==%s\n", slowo, slowo);
} else {
printf("%s!=%s\n", slowo, slowo);
}
}
return 0;
}
Wystarczy iterować do momentu gdy początek (czyli tab), jest mniejszy niż element ostatni i w każdym obiegu zmniejszać wskaźnik. Można jeszcze urwać kilka bajtów (bo raczej większej szybkości już nie uzyskasz):
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAX 30
bool Palindrom(const char *tab)
{
const char * last = tab + strlen(tab) - 1;
while(tab < last)
{
if(*(tab++) != *(last--)) {
return false; // Jeśli nie palindrom, zwróć false
}
}
return true;
}
int main(void)
{
unsigned n;
char slowo[MAX];
scanf(" %d", &n);
for (unsigned i = 0; i < n; ++i) {
scanf("%s", slowo);
printf("%s%c=%s\n", slowo, (Palindrom(slowo) ? '=': '!'), slowo);
}
return 0;
}
Tu wystarczy zauważyć że w obydwu wynikach zmienia się wyłącznie jeden znak wyświetlany.
Już "hiperporawne" będzie zwracanie z funkcji w 1 miejscu returnem wartości. Niektóre standardy kodowania tego wymagają.
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAX 30
bool Palindrom(const char *tab)
{
const char * last = tab + strlen(tab) - 1;
bool answer = true;
while(tab < last)
{
if(*(tab++) != *(last--)) {
answer = false;
break;
}
}
return answer;
}
int main(void)
{
unsigned n;
char slowo[MAX];
scanf(" %d", &n);
for (unsigned i = 0; i < n; ++i) {
scanf("%s", slowo);
printf("%s%c=%s\n", slowo, (Palindrom(slowo) ? '=': '!'), slowo);
}
return 0;
}
Niestety, dla C aby osiągnąć bardziej zaawansowane efekty, wskaźniki są niezbędne...
PS. A na koniec bonus do własnej analizy (choć tak bym w projektach nie pisał):
bool Palindrom(const char *tab)
{
const char * last = tab + strlen(tab) - 1;
bool answer = true;
while(((tab < last) && ((*(tab++) == *(last--)) || (answer = false)))) {}
return answer;
}