Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Test if an integer is a palindrome in c language

Reply
Thread Tools

Test if an integer is a palindrome in c language

 
 
user923005
Guest
Posts: n/a
 
      08-14-2007
/* 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 <stdlib.h>
#include <string.h>
/* 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 <stdio.h>
static char string[50] =
{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
....
*/


 
Reply With Quote
 
 
 
 
Ben Bacarisse
Guest
Posts: n/a
 
      08-14-2007
user923005 <(E-Mail Removed)> writes:

> /* Original ltostr() was hosed. Fixed version: */


<string-based palindrome tester snipped>

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.
 
Reply With Quote
 
 
 
 
user923005
Guest
Posts: n/a
 
      08-14-2007
On Aug 14, 3:33 pm, Ben Bacarisse <(E-Mail Removed)> wrote:
> user923005 <(E-Mail Removed)> writes:
> > /* Original ltostr() was hosed. Fixed version: */

>
> <string-based palindrome tester snipped>
>
> 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.

 
Reply With Quote
 
Ben Bacarisse
Guest
Posts: n/a
 
      08-14-2007
user923005 <(E-Mail Removed)> writes:

> On Aug 14, 3:33 pm, Ben Bacarisse <(E-Mail Removed)> wrote:
>> user923005 <(E-Mail Removed)> writes:
>> > /* Original ltostr() was hosed. Fixed version: */

>>
>> <string-based palindrome tester snipped>
>>
>> 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.
 
Reply With Quote
 
CBFalconer
Guest
Posts: n/a
 
      08-15-2007
Wabz wrote:
> Kevin Handy <(E-Mail Removed)> wrote:
>> Wabz wrote:
>>
>>> Does anyone know how to write a function that tests if an integer
>>> is 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.
<http://cbfalconer.home.att.net>


--
Posted via a free Usenet account from http://www.teranews.com

 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      08-15-2007
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 <stdio.h>
#include <string.h>
#include <limits.h>

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
 
Reply With Quote
 
Richard
Guest
Posts: n/a
 
      08-15-2007
pete <(E-Mail Removed)> writes:

> 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 <stdio.h>
> #include <string.h>
> #include <limits.h>
>
> 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;



--
 
Reply With Quote
 
Ben Pfaff
Guest
Posts: n/a
 
      08-15-2007
user923005 <(E-Mail Removed)> writes:

> 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.
--
Ben Pfaff
http://benpfaff.org
 
Reply With Quote
 
Harald van =?UTF-8?B?RMSzaw==?=
Guest
Posts: n/a
 
      08-15-2007
Ben Pfaff wrote:
> user923005 <(E-Mail Removed)> writes:
>
>> 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.
 
Reply With Quote
 
Ben Pfaff
Guest
Posts: n/a
 
      08-15-2007
Harald van Dijk <(E-Mail Removed)> writes:

> Ben Pfaff wrote:
>> user923005 <(E-Mail Removed)> writes:
>>
>>> 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.


I meant the ratio. Oops.
--
"I hope, some day, to learn to read.
It seems to be even harder than writing."
--Richard Heathfield
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: Re: Palindrome Tim Churches Python 2 06-05-2011 03:24 AM
Palindrome Runic911 Python 24 11-15-2003 12:08 AM
Re: Palindrome Pierre Quentel Python 2 11-13-2003 06:11 PM
Palindrome (HELP) Lorin Leone C++ 4 11-13-2003 08:11 AM
test test test test test test test Computer Support 2 07-02-2003 06:02 PM



Advertisments