Пример #1
0
struct fraction fractionMultiply(struct fraction a, struct fraction b) {
	struct fraction init = fractionCreate(0, 0);
	if (a.divisor == 0 || b.divisor == 0)
		return init;

	// firstly convert both fractions to improper form
	a.remainder += a.whole * a.divisor;
	b.remainder += b.whole * b.divisor;
	a.whole = 0, b.whole = 0;

	return fractionCreate(a.remainder * b.remainder, a.divisor * b.divisor);
}
Пример #2
0
struct fraction fractionSubtract(struct fraction a, struct fraction b) {
	struct fraction init = fractionCreate(0, 0);
	if (a.divisor == 0 || b.divisor == 0)
		return init;

	if (b.whole != 0)
		b.whole = -b.whole;
	else
		b.remainder = -b.remainder;

	return fractionAdd(a, b);
}
Пример #3
0
int main (void)
{
  struct fraction a, b, c, d, r, bad;

  a = fractionCreate (5, 6);
  b = fractionCreate (8, 9);
  c = fractionCreate (56, 160);
  d = fractionCreate (35, 150);
  bad = fractionCreate (8, 0);
  struct fraction e=fractionCreate(31,0);

fractionPrint(e);
  r = fractionAdd (a, b);
  fractionPrint(r);
  r = fractionSubtract (c, d);
  fractionPrint(r);
  r = fractionMultiply (a, b);
  fractionPrint(r);
  r = fractionDivide (c, d);
  fractionPrint(r);

  r = fractionAdd (a, bad);
  fractionPrint(r);
  r = fractionAdd (b, r);
  fractionPrint(r);
  e=fractionAdd(b,fractionAdd(a,bad));
fractionPrint(e);
  return 0;
}
Пример #4
0
struct fraction fractionAdd(struct fraction a, struct fraction b) {
	struct fraction result = fractionCreate(0, 0);
	if (a.divisor == 0 || b.divisor == 0)
		return result;

	// The addition of fractions a and b here, where a and/or b are possibly
	// negative, is done in mixed form, WITHOUT firstly converting to improper
	// form to decrease the chance of integer overflows.

	int signA = (a.whole != 0 && a.whole < 0 || a.remainder < 0) ? -1 : 1;
	int signB = (b.whole != 0 && b.whole < 0 || b.remainder < 0) ? -1 : 1;

	result.whole = a.whole * signA + b.whole * signB;
	result.divisor = a.divisor * b.divisor; // positive, unsimplified

	// temporary variable that holds the sum's numerator (unsimplified)
	int t = abs(a.remainder * b.divisor) * signA;
	t = t + abs(b.remainder * a.divisor) * signB;

//	printf("signA signB: %d %d\n", signA, signB);
//	printf("basic sum: %d %d\\%d\n", result.whole, result.divisor, t);

	// correct the (t / result.divisor) term
	if (abs(t) > abs(result.divisor)) // convert to mixed fraction
		result.whole += t / abs(result.divisor);

//	printf("result.whole + (t / result.divisor) = + %d\n", t / result.divisor);

	// simplify remainder ÷ divisor (using the gcd)
	int A = result.divisor; // divisor (usually the bigger, so use as A for GCD)
	int B = abs(t % result.divisor); // remainder
	int tmp, copyA = A, copyB = B;

//	printf("A B: %d %d\n", A, B);

	while (B != 0) // A = gcd(A, B)
		tmp = B, B = A % B, A = tmp;

//	printf("gcd(A, B) = %d\n", A);

	result.remainder = copyB / A;
	result.divisor = copyA / A;
	return result;
}
Пример #5
0
void fractionPrint (struct fraction f)
{
 struct fraction g= fractionCreate(f.numerator,f.denominator);
 
 //if numbers are positive without 1 as denominator or 0 as numerator
 
 if(g.denominator>0&&g.denominator!=1&&g.numerator>=0)
 {

  if(g.numerator<g.denominator)
  {
   printf("%d/%d\n",g.numerator,g.denominator);
  }

//converts improper fraction to mixed number
  else
  {
   int ctr=0;//counts whole numbers

   while(g.numerator>g.denominator)
   {
    g.numerator-=g.denominator;
    ctr++;
   }

   printf("%d %d/%d\n",ctr,g.numerator,g.denominator);

  }

 }

//for negative fractions

if(g.numerator<0)
 {
  g.numerator= g.numerator*(-1);//converts to absolute value

  printf("-");//print negative symbol

  if(g.numerator<g.denominator)
  {
   printf("%d/%d\n",g.numerator,g.denominator);
  }

//converts improper fraction to mixed number
  else
  {
   int ctr=0;

   while(g.numerator>g.denominator)
   {
    g.numerator-=g.denominator;
    ctr++;
   }

   printf("%d %d/%d\n",ctr,g.numerator,g.denominator);
  }

 }

if(g.denominator<0)
 {
  g.denominator=g.denominator*(-1);//converts to absolute value

  printf("-");//print negative symbol

  if(g.numerator<g.denominator)
  {
   printf("%d/%d\n",g.numerator,g.denominator);
  }

//converts improper fraction to mixed number
  else
  {
   int ctr=0;

   while(g.numerator>g.denominator)
   {
    g.numerator-=g.denominator;
    ctr++;
   }

   printf("%d %d/%d\n",ctr,g.numerator,g.denominator);
  }

 }

//if the denominator is 0
 if(g.denominator==0)
 {
 printf("Divide by zero!\n");
 }

//if the denominator is 1, only output the numerator
 if(g.denominator==1)
 {
 printf("%d\n",g.numerator);
 }


}