Skip to content

Instantly share code, notes, and snippets.

@interfector
Created September 12, 2009 08:51
Show Gist options
  • Save interfector/185763 to your computer and use it in GitHub Desktop.
Save interfector/185763 to your computer and use it in GitHub Desktop.
/* Compiling
* gcc fraz.c -o fraz -Wall -pedantic -lm
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct fraz
{
int num;
int den;
} fraz_t;
fraz_t fraz_swap(fraz_t one);
fraz_t fraz_solve(fraz_t one);
fraz_t f_add(fraz_t one,fraz_t two);
fraz_t f_sub(fraz_t one,fraz_t two);
fraz_t f_mul(fraz_t one,fraz_t two);
fraz_t f_div(fraz_t one,fraz_t two);
fraz_t f_sqrt(fraz_t one);
fraz_t f_pow(fraz_t one,int i);
fraz_t fraz_swap(fraz_t one);
fraz_t fraz_conv(float num);
int fraz_proper(fraz_t one);
int fraz_improper(fraz_t one);
int fraz_app(fraz_t one);
int fraz_eq(fraz_t one,fraz_t two);
int fraz_cmp(fraz_t one,fraz_t two); /* Result: 0 -> equivalent 1 -> First major 2 -> Second major */
int mcm_solve(int a,int b);
int mcd(int a,int b);
int nlen(int num);
void fraz_print(fraz_t one);
#define ABS(x) ((x < 0) ? -x : x)
fraz_t fraz_solve(fraz_t one)
{
fraz_t solved;
int mcdn = mcd(one.num,one.den);
solved.num = one.num;
solved.den = one.den;
if (mcdn == 1)
return solved;
while ((solved.num % mcdn) == 0 && (solved.den % mcdn) == 0)
{
solved.num /= mcdn;
solved.den /= mcdn;
}
return solved;
}
fraz_t f_sqrt(fraz_t one)
{
fraz_t sqrtf;
sqrtf.num = sqrt(one.num);
sqrtf.den = sqrt(one.den);
return fraz_solve(sqrtf);
}
int fraz_proper(fraz_t one)
{
return (ABS(one.num) < ABS(one.den));
}
int fraz_improper(fraz_t one)
{
return (ABS(one.num) > ABS(one.den));
}
int fraz_app(fraz_t one)
{
fraz_t frazz;
if (one.num == one.den)
return 1;
frazz = fraz_solve(one);
if ((frazz.num != one.num) || (frazz.den != one.den))
return 1;
return 0;
}
int fraz_eq(fraz_t one,fraz_t two)
{
fraz_t frazz = fraz_solve(one);
fraz_t frazzt = fraz_solve(two);
if ((frazz.num != frazzt.num) || (frazz.den != frazzt.den))
return 0;
return 1;
}
int fraz_cmp(fraz_t one,fraz_t two)
{
if (fraz_eq(one,two) == 1)
return 0;
if ((one.num * two.den) > (one.den * two.num))
return 1;
return 2;
}
fraz_t f_pow(fraz_t one,int i)
{
int n;
fraz_t powed;
powed.num = one.num;
powed.den = one.den;
if (i<0)
powed = fraz_swap(powed);
i = -i;
for(n=1;n<i;n++)
{
powed.num *= powed.num;
powed.den *= powed.den;
}
return fraz_solve(powed);
}
fraz_t f_add(fraz_t one,fraz_t two)
{
fraz_t added;
int mcm;
if (one.den == two.den)
{
added.den = one.den;
added.num = one.num + two.num;
} else {
mcm = mcm_solve(one.den,two.den);
added.den = mcm;
added.num = ((mcm / one.den) * one.num) + ((mcm / two.den) * two.num);
}
return fraz_solve(added);
}
fraz_t f_sub(fraz_t one,fraz_t two)
{
fraz_t subd;
int mcm;
if (one.den == two.den)
{
subd.den = one.den;
subd.num = one.num - two.num;
} else {
mcm = mcm_solve(one.den,two.den);
subd.den = mcm;
subd.num = ((mcm / one.den)*one.num) - ((mcm / two.den)*two.num);
}
return fraz_solve(subd);
}
fraz_t f_mul(fraz_t one,fraz_t two)
{
fraz_t mull;
mull.den = one.den * two.den;
mull.num = one.num * two.num;
return fraz_solve(mull);
}
fraz_t f_div(fraz_t one,fraz_t two)
{
return f_mul(one,fraz_swap(two));
}
fraz_t fraz_swap(fraz_t one)
{
fraz_t swapped;
swapped.num = one.den;
swapped.den = one.num;
return swapped;
}
fraz_t fraz_conv(float num)
{
fraz_t conv;
int found=0;
int size = sizeof(float)*nlen((int)num)+10;
char *fl=(char*)malloc(size+1);
snprintf(fl,size,"%f",num);
conv.num = 0;
conv.den = 1;
for(;*fl;fl++)
{
if (found == 0)
{
if (*fl == '.')
{
found = 1;
} else {
conv.num = conv.num * 10 + (*fl - 48 );
}
} else {
conv.den = conv.den * 10;
conv.num = conv.num * 10 + (*fl - 48 );
}
}
return fraz_solve(conv);
}
int mcm_solve(int a,int b)
{
return ((a*b) / mcd(a,b));
}
int mcd(int a, int b)
{
int r = 1;
if (a == 0)
return b;
else
while (r > 0)
{
r = a % b;
a = b;
b = r;
}
return a;
}
int nlen(int num)
{
int len;
if (num==0)
return 1;
for(len=0;num != 0;num /= 10,len++);
return len;
}
void fraz_print(fraz_t one)
{
int i;
int len = ((one.num > one.den) ? nlen(one.num) : nlen(one.den));
printf("%d\n",one.num);
for(i=0;i<len;i++)
putchar('_');
printf("\n%d\n",one.den);
}
int main(int argc,char *argv[])
{
float n;
printf("Float:");
scanf("%f",&n);
printf("\n");
fraz_print(fraz_conv(n));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment