קוד:
#include <stdio.h>
#include <stdlib.h>
#define MIN(x,y) ((x) <= (y) ? (x) : (y))
int countDigits(int num);
int checkPalindromAroundIndex(int num, int index,int len);
int findDigitAtIndex(int num,int idx);
int _checkPalindromAroundIndex(int num,int index,int dist);
void findMaxPalindrom(int num);
int main ()
{
int num=1343651567;
findMaxPalindrom(num);
return 0;
}
void findMaxPalindrom(int num)
{
int len=countDigits(num);
int maxCount=0;
int maxIdx=-1;
int idx=0;
for (;idx < len ; ++idx) {
int res=checkPalindromAroundIndex(num,idx,len);
if (res > maxCount) {
maxIdx=idx;
maxCount=res;
}
}
if (maxCount <= 0)
return;
printf("\n=======================\n");
for (idx=maxIdx-maxCount ; idx <= maxIdx+maxCount;++idx)
printf("%d",findDigitAtIndex(num,idx));
printf("\n=======================\n");
}
int findDigitAtIndex(int num,int idx)
{
int curr=countDigits(num)-1;
while (1) {
int dig=num%10;
if (curr==idx)
return dig;
num/=10;
curr--;
}
return -1; //Shouldn't happen
}
int checkPalindromAroundIndex(int num,int index,int len)
{
int leftSpace=index;
int rightSpace=(len - 1) - index;
int minSpace=MIN(leftSpace,rightSpace);
while (minSpace > 0) {
int res=_checkPalindromAroundIndex(num,index,minSpace) ;
if (res)
return minSpace;
minSpace--;
}
return -1;
}
int _checkPalindromAroundIndex(int num,int index,int dist)
{
while (dist > 0) {
int digL=findDigitAtIndex(num,index - dist);
int digR=findDigitAtIndex(num,index + dist);
if (digL!=digR)
return 0;
dist--;
}
return 1;
}
int countDigits(int num)
{
int count=0;
while (num > 0) {
num/=10;
count++;
}
return count;
}