Sunday, August 14, 2011

Problem 33

prob33.c Problem 33
Filename: prob33.c
/* Problem 33 */

/* The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplify it may incorrectly believe that 49/98 = 4/8, which is correct, is obtained by cancelling the 9s.
 * 
 * We shall consider fractions like, 30/50 = 3/5, to be trivial examples.
 * 
 * There are exactly four non-trivial examples of this type of fraction, less than one in value, and containing two digits in the numerator and denominator.
 * 
 * If the product of these four fractions is given in its lowest common terms, find the value of the denominator.
 */
 
#include <stdio.h>

inline void getDigits(const int number, int digits[])
{
  digits[0] = number/10;
  digits[1] = number%10;
}

inline void dumbCancelResult(const int num_digits[], const int denom_digits[], int *canceled_num, int *canceled_denom)
{
  if(num_digits[0] == denom_digits[0] && num_digits[0] != 0)
    {
      *canceled_num = num_digits[1];
      *canceled_denom = denom_digits[1];
    }
  else if(num_digits[0] == denom_digits[1] && num_digits[0] != 0)
    {
      *canceled_num = num_digits[1];
      *canceled_denom = denom_digits[0];
    }
  else if(num_digits[1] == denom_digits[0] && num_digits[1] != 0)
    {
      *canceled_num = num_digits[0];
      *canceled_denom = denom_digits[1];
    }
  else if(num_digits[1] == denom_digits[1] && num_digits[1] != 0)
    {
      *canceled_num = num_digits[0];
      *canceled_denom = denom_digits[0];
    }
  else
    {
      *canceled_num = 1;
      *canceled_denom = 1;
    }
}

int main()
{
  int num, denom;
  int canceled_denom = 0;
  int canceled_num = 0;
  int num_digits[2];
  int denom_digits[2];
  int num_answer = 1;
  int denom_answer = 1;
  
  for(num = 10; num<=99; ++num)
    {
      for(denom = num+1; denom<99; ++denom)
	{
	  getDigits(num, num_digits);
	  getDigits(denom, denom_digits);
	  
	  dumbCancelResult(num_digits, denom_digits, &canceled_num, &canceled_denom);
	  if((float)num/(float)denom == (float)canceled_num/(float)canceled_denom)
	    {
	      printf("%d/%d (%d/%d)\n", num, denom, canceled_num, canceled_denom);
	      num_answer *= num;
	      denom_answer *= denom;
	    }
	}
    }
  
  printf("result: %d/%d\n", num_answer, denom_answer);
  printf("answer: %d\n", denom_answer/num_answer);
  
  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1

No comments:

Post a Comment