424,963 Members | 2,490 Online Need help? Post your question and get tips & solutions from a community of 424,963 IT Pros & Developers. It's quick & easy.

Test if an integer is a palindrome in c language

 P: n/a Hello mates, Does anyone know how to write a function that tests if an integer is a palindrome in C language? Aug 14 '07 #1
20 Replies

 P: n/a Wabz wrote: Does anyone know how to write a function that tests if an integer is a palindrome in C language? Yes. I'm quite sure that someone does. ----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==---- http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups ----= East and West-Coast Server Farms - Total Privacy via Encryption =---- Aug 14 '07 #2

 P: n/a On Aug 14, 1:19 pm, Kevin Handy

 P: n/a "Wabz" writes: On Aug 14, 1:19 pm, Kevin Handy Wabz wrote: Does anyone know how to write a function that tests if an integer is apalindromein C language? Yes. I'm quite sure that someone does. Could this someone possibly help me write the said program? Start by extracting the individual digits of the integer. You may find the modulo operator, %, helpful. There is another way, involving sprintf() in , but if this is a school assignment, the instructor probably expects the modulo way. Aug 14 '07 #4

 P: n/a On Tue, 14 Aug 2007 17:10:51 +0000, Wabz wrote: Hello mates, Does anyone know how to write a function that tests if an integer is a palindrome in C language? I assume you mean palindrome in base 10. sprintf() it to a string, and then check whether the string is palindrome: len = strlen(str); for (i = 0; i < len/2; i++) { if (str[i] != str[len - i - 1]) break; /*it is not palindome*/ } -- Army1987 (Replace "NOSPAM" with "email") No-one ever won a game by resigning. -- S. Tartakower Aug 14 '07 #5

 P: n/a "Wabz"

 P: n/a Wabz wrote, On 14/08/07 18:42: On Aug 14, 1:19 pm, Kevin Handy Wabz wrote: >>Does anyone know how to write a function that tests if an integer is apalindromein C language? Yes. I'm quite sure that someone does.----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----http://www.newsfeeds.comThe #1 Newsgroup Service in the World! 120,000+ Newsgroups----= East and West-Coast Server Farms - Total Privacy via Encryption =---- Please don't quote things you are not commenting on, such as the annoying text appended to Kevin's post. Could this someone possibly help me write the said program? Yes, I'm sure one of the people meeting those requirements could help if they were so desired. However, knowledgeable people are unlikely to do your homework for you when you have not even made an attempt. So if you want help you should attempt it and then post your attempt here with any questions you have. The more effort you put in the more people will be prepared to help you. -- Flash Gordon Aug 14 '07 #7

 P: n/a On Aug 14, 11:20 am, Army1987

 P: n/a On Aug 14, 2:15 pm, user923005 #include /* ltostr is from snippets (I fixed the broken bit). */ char *ltostr(long long num, char *string, size_t max_chars, unsigned base) { char remainder; int sign = 0; if (base < 2 || base 36) return ((void *) 0); if (num < 0) { sign = 1; num = -num; } if (num == 0) /* bugbug:drc formerly wrong result here... */ return "0"; string[--max_chars] = '\0'; for (max_chars--; max_chars sign && num != 0; max_chars--) { remainder = (char) (num % base); if (remainder < 9) string[max_chars] = remainder + '0'; else string[max_chars] = remainder - 10 + 'A'; num /= base; } if (sign) string[--max_chars] = '-'; if (max_chars 0) memset(string, ' ', max_chars + 1); return string + max_chars; } int ispal(const char *start) { const char *end = start + strlen(start) - 1; while (end start) { if (*start != *end) { return 0; } start++; end--; } return 1; } #include static char string = {0}; int main(void) { long long index; unsigned base; for (index = 0; index < 4000000000; index++) { for (base = 2; base < 37; base++) { long long val = index; char *p = ltostr(val, string, sizeof string, base); if (isspace(*p)) p++; if (ispal(p)) { printf("%llu = %s is a palindrome in base %u\n", val, p, base); } } } return 0; } Aug 14 '07 #9

 P: n/a /* Original ltostr() was hosed. Fixed version: */ static const char B36TAB[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; #include #include /* ltostr is from snippets (I fixed the broken bit). */ char *ltostr(long long num, char *string, size_t max_chars, unsigned base) { char remainder; int sign = 0; if (base < 2 || base 36) return ((void *) 0); if (num < 0) { sign = 1; num = -num; } if (num == 0) /* bugbug:drc formerly wrong result here... */ return "0"; string[--max_chars] = '\0'; for (max_chars--; max_chars sign && num != 0; max_chars--) { remainder = (char) (num % base); string[max_chars] = B36TAB[remainder]; num /= base; } if (sign) string[--max_chars] = '-'; if (max_chars 0) memset(string, ' ', max_chars + 1); return string + max_chars; } int ispal(const char *start) { const char *end = start + strlen(start) - 1; while (end start) { if (*start != *end) { return 0; } start++; end--; } return 1; } #include static char string = {0}; int main(void) { long long index; unsigned base; for (index = 0; index < 4000000000; index++) { for (base = 2; base < 37; base++) { long long val = index; char *p = ltostr(val, string, sizeof string, base); if (isspace(*p)) p++; if (ispal(p)) { printf("%llu = %s is a palindrome in base %u\n", val, p, base); } } } return 0; } /* Sample output: .... 2290134 = E656E is a palindrome in base 20 2290141 = 84548 is a palindrome in base 23 2290156 = 1IEI1 is a palindrome in base 35 2290187 = 9H1H9 is a palindrome in base 22 2290220 = 36Q63 is a palindrome in base 29 2290252 = 11022100122011 is a palindrome in base 3 2290293 = 50805 is a palindrome in base 26 2290322 = 2OOO2 is a palindrome in base 30 2290353 = 925529 is a palindrome in base 12 2290378 = 4270724 is a palindrome in base 9 2290391 = HAHAH is a palindrome in base 19 2290460 = BG6GB is a palindrome in base 21 2290499 = 2ERE2 is a palindrome in base 31 2290501 = 1D3D1 is a palindrome in base 36 2290530 = 5LEL5 is a palindrome in base 25 2290534 = E666E is a palindrome in base 20 2290627 = 3K9K3 is a palindrome in base 28 2290641 = 1000101111001111010001 is a palindrome in base 2 2290658 = 20233033202 is a palindrome in base 4 2290670 = 84648 is a palindrome in base 23 2290671 = 9H2H9 is a palindrome in base 22 2290686 = 6LGL6 is a palindrome in base 24 2290735 = 13EE31 is a palindrome in base 18 2290738 = 48A84 is a palindrome in base 27 2290752 = HAIAH is a palindrome in base 19 2290850 = 25T52 is a palindrome in base 32 2290853 = 1O9O1 is a palindrome in base 34 2290901 = BG7GB is a palindrome in base 21 2290922 = 2290922 is a palindrome in base 10 .... */ Aug 14 '07 #10

 P: n/a user923005 I like this way: int pal_aux(int n, int r, int b) { return n == 0 ? r : pal_aux(n / b, r * b + n % b, b); } int is_pal_in_base(int n, int b) { return pal(n, 0, b) == n; } (not well tested, but it *looks* sound!) -- Ben. Aug 14 '07 #11

 P: n/a On Aug 14, 3:33 pm, Ben Bacarisse I like this way: int pal_aux(int n, int r, int b) { return n == 0 ? r : pal_aux(n / b, r * b + n % b, b); } int is_pal_in_base(int n, int b) { return pal(n, 0, b) == n; /*Did you mean:*/ return pal_aux(n, 0, b) == n; } (not well tested, but it *looks* sound!) Certainly much brighter than converting to character. But it makes it harder to see the answers. Aug 14 '07 #12

 P: n/a user923005 user923005 I like this way: int pal_aux(int n, int r, int b) { return n == 0 ? r : pal_aux(n / b, r * b + n % b, b); } int is_pal_in_base(int n, int b) { return pal(n, 0, b) == n; /*Did you mean:*/ return pal_aux(n, 0, b) == n; Yes. Thanks for spotting it that. One day I'll remember just to paste the code, and to "tidy it up" for posting. (I added the _aux because I thought "pal" rather too sort a name, even for a small helper function.) -- Ben. Aug 14 '07 #13

 P: n/a Wabz wrote: Kevin Handy Wabz wrote: >>Does anyone know how to write a function that tests if an integeris a palindromein C language? Yes. I'm quite sure that someone does. Could this someone possibly help me write the said program? I suggest you first find him and then ask him (or her). An alternative would be to do your own homework. -- Chuck F (cbfalconer at maineline dot net) Available for consulting/temporary embedded and systems. -- Posted via a free Usenet account from http://www.teranews.com Aug 15 '07 #14

 P: n/a Wabz wrote: > Hello mates, Does anyone know how to write a function that tests if an integer is a palindrome in C language? /* BEGIN new.c */ #include #include #include int integer_is_palindrome(long unsigned integer); char *str_rev(char *s); int main(void) { int integer; for (integer = 0; 1000 integer; ++integer) { if (integer_is_palindrome(integer)) { printf("%d\n", integer); } } return 0; } int integer_is_palindrome(long unsigned integer) { char lutoa_buff[(sizeof(long) * CHAR_BIT) / 3 + 1]; char copy[sizeof lutoa_buff]; sprintf(lutoa_buff, "%lu", integer); strcpy(copy, lutoa_buff); str_rev(copy); return strcmp(copy, lutoa_buff) == 0; } char *str_rev(char *s) { char *const p = s; char *t = p; char swap; if (*t != '\0' && *++t != '\0') { t += strlen(t + 1); do { swap = *t; *t-- = *s; *s++ = swap; } while (t s); } return p; } /* END new.c */ -- pete Aug 15 '07 #15

 P: n/a pete >Hello mates,Does anyone know how to write a function that tests if an integer is apalindrome in C language? /* BEGIN new.c */ #include #include #include int integer_is_palindrome(long unsigned integer); char *str_rev(char *s); int main(void) { int integer; for (integer = 0; 1000 integer; ++integer) { if (integer_is_palindrome(integer)) { printf("%d\n", integer); } } return 0; } int integer_is_palindrome(long unsigned integer) { char lutoa_buff[(sizeof(long) * CHAR_BIT) / 3 + 1]; char copy[sizeof lutoa_buff]; sprintf(lutoa_buff, "%lu", integer); strcpy(copy, lutoa_buff); str_rev(copy); return strcmp(copy, lutoa_buff) == 0; } char *str_rev(char *s) { char *const p = s; char *t = p; char swap; if (*t != '\0' && *++t != '\0') { t += strlen(t + 1); do { swap = *t; *t-- = *s; *s++ = swap; } while (t s); } return p; } /* END new.c */ slow? something like this for the palindrome check on the string. Untested and pretty much pseudo code. len=strlen(p); endp=p+len-1; while(endp>p) if ((*endp--)!=(*p++)) return 0; return 1; -- Aug 15 '07 #16

 P: n/a user923005

 P: n/a Ben Pfaff wrote: user923005 It might be interesting to try every base from 2 to 36.Given that condition, what percentage of integers are palindromes? I don't have an answer, but a few moments of arithmetic led me to discover that in base B there are pow(B, -N/2) palindromic numbers of length N, for even N. Somehow this is pleasing, even though it's almost trivial. What you calculated is the ratio of palindromic numbers in all numbers of length N, not the amount of palindromic numbers of length N. In base 10, there are not 0.1 but 9 palindromic numbers of length 2. I'm not sure whether you meant to post an expression that would return 9, or whether you meant to describe your expression as returning the ratio. Aug 15 '07 #18

 P: n/a Harald van DÄ³k user923005 >It might be interesting to try every base from 2 to 36.Given that condition, what percentage of integers are palindromes? I don't have an answer, but a few moments of arithmetic led me todiscover that in base B there are pow(B, -N/2) palindromic numbersof length N, for even N. Somehow this is pleasing, even thoughit's almost trivial. What you calculated is the ratio of palindromic numbers in all numbers of length N, not the amount of palindromic numbers of length N. In base 10, there are not 0.1 but 9 palindromic numbers of length 2. I'm not sure whether you meant to post an expression that would return 9, or whether you meant to describe your expression as returning the ratio. I meant the ratio. Oops. -- "I hope, some day, to learn to read. It seems to be even harder than writing." --Richard Heathfield Aug 15 '07 #19

 P: n/a In article <11*********************@w3g2000hsg.googlegroups.c omuser923005

 P: n/a "Dik T. Winter" = n-1. The first few are 3, 4, 6, 11, 19, 47 and 53. They seem to be common (though not as common as primes). There are also numbers that are multi-palindromic (being palindromic in more that their fair share of bases). For example, 21 (in bases 2, 4, and 6), 36, (in 5, 8, 11 and 17) and 60 (9, 11, 14, 19 and 29). You might also be interested to know (I did not until yesterday) that some bases provoke palindromism much more than others. In a quick count for the numbers between 3 100000, it turns out that 47 makes more of these numbers palindromic than any other base. There is a little cluster around 47: B Number of numbers in 3..99999 that are palindromic in base B 47 2125 46 2116 48 2081 49 2038 This "most palindromic base" creeps upwards (very slowly) as more numbers are considered, but the presence of a cluster made me think it might be worth plotting. Think it was. The curve is curious and unexpected (at least to me). Cross-posted (with followups set) to comp-programming. I hope that is the right thing to do. We are certainly off topic now!  An invented term, as far as I know.  One must decide about 0, 1 and 2 simply by definition, I think.  http://www.bsb.me.uk/palindrome/ -- Ben. Aug 16 '07 #21 