From: fortytwo@xs4all.nl
I'm not intendig to proof anything, but I wrote this some time ago when being
bored.
#include
#include
#include
#include
#include
#define N 1024
int check(char *s)
{
int result=1;
while (*s)
{
if (!isdigit(*s++))
{
result=0;
}
}
return(result);
}
char *insert(char *s,char c,int *l)
{
int i;
assert (*l<(N-1));
for (i=*l; i; --i)
{
s[i]=s[i-1];
}
s[0]=c;
++(*l);
s[*l]='\0';
return(s);
}
char *even(char *s,int *l)
{
int c,carry,i;
char *copy;
copy=malloc(*l+1);
assert(copy!=NULL);
copy[*l]='\0';
carry=0;
for (i=0; i<*l; ++i)
{
c=s[i]-'0'+carry;
carry=0;
if (c&1)
{
carry=10;
c-=1;
}
c=c/2;
copy[i]=c+'0';
}
i=0;
while (copy[i]=='0')
{
++i;
}
(*l)-=i;
strcpy(s,copy+i);
free(copy);
return(s);
}
char *odd(char *s,int *l)
{
int c,carry,i;
char *copy;
copy=malloc(*l+2);
assert(copy!=NULL);
carry=0;
copy[*l]='\0';
for (i=*l; i; --i)
{
c=3*(s[i-1]-'0')+carry;
if (i==*l)
{
++c;
}
copy[i-1]=(c%10)+'0';
carry=(c-(c%10))/10;
}
while(carry)
{
c=carry%10;
insert(copy,c+'0',l);
carry=(c-(c%10))/10;
}
strcpy(s,copy);
free(copy);
return(s);
}
int main(int argc,char *argv[])
{
int i,l;
char data[N];
for (i=1; i
|