Monday, August 15, 2011

Problem 44

prob44.c Problem 44
Filename: prob44.c
/*Pentagonal numbers are generated by the formula, Pn=n(3n1)/2. The first ten pentagonal numbers are:
 *
 *1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...
 *
 *It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference, 70  22 = 48, is not pentagonal.
 *
 *Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference is pentagonal and D = |Pk  Pj| is minimised; what is the value of D?
 */


#include <stdio.h>
#include <math.h>

typedef unsigned long long number;

inline number pentagonal(const number n)
{
  return n*(3*n-1)/2;
}

inline number diff(const number x, const number y)
{
  if(x>y)
    {
      return x-y;
    }
  else
    {
      return y-x;
    }
} 

inline int isPentagonal(const number x)
{
  //	if(ceil((1+sqrt(1-24*x))/6) == floor((1+sqrt(1-24*x))/6))
  //		{
  //			return 1;
  //		}
  //	else
  //		{
  //			return 0;
  //		}
  int i;
  for(i=1; pentagonal(i) < x; ++i)
    ;
  
	return pentagonal(i) == x;
}

inline int meetsCriteria(const number x, const number y)
{
  
  
  return isPentagonal(x+y) &&
    isPentagonal(diff(x,y));
}

int main()
{
  int x = 1;
  int y = 1;
  
  //	printf("pentagonal(20000) = %llu\n", pentagonal(20000));
  //	return 0;
  
  for(x=1; ; ++x)
    {
      for(y=1; y<=x; ++y)
	{ 
	  if(meetsCriteria(pentagonal(x), pentagonal(y)))
	    {
	      printf("pentagonal(x)=%lld, pentagonal(y)=%lld, diff(x,y)=%lld\n", 
								   pentagonal(x), 
		     pentagonal(y), 
		     diff(pentagonal(x), pentagonal(y)));
	      return 0;
						}
	  //					if(x % 100 == 0 || y % 100 == 0)
	  //						{
	  //							printf("(x,y) : (%d,%d)\n", x, y);
//						}
	}
    }
  
  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1

No comments:

Post a Comment