CS 100: Programming Assignment P3
Solution
// This class contains methods that can be used to answer various
// combinatoric questions that involve binomial coefficients.
public class MyMath
{
// The class constants:1 point correctness and 1 point style.
// -1 style if no comments
public static final int KMAX = 100; // Iteration maximum for square root
public static final double TOL = .0000000000000001; // Square root tolerance
public static final double PI = 3.14159265358979;
public static final double E = 2.71828182845905;
// The square root method = 2 points correctness + 1 point style
// -1 style if NO comments to assist in understanding the loop.
// -1 style if specification inadequate.
// While loop condition 2 points. -1 if "or" instead of 'and"
// One point for the right loop body.
// Yields the square root of x.
// The value of x must be nonnegative.
public static double sqrt(double x)
int k; // Counts the number of square root improvements
double y; // The kth improvement.
k=0;
y=x;
while(k<KMAX && abs(x-y*y)/x > TOL)
{
y = (y+x/y)/2.0;
k++;
}
return y;
}
// Absolute value method: 1 point correctness and 1 point style
// -1 if specification inadequate
// Yields the absolute value of x.
public static double abs(double x)
{
if (x>=0)
{return x;}
else
{return -x;}
}
// The binCoeff Method = 3 points correctness + 1 point style
// 1 point for loop range, 1 point for loop body, 1 point for k = n-k idea
// -1 style if correct but change output or input type to double
// -1 style inadequate specification
// -1 style if NO comments to help follow what the loop is doing.
// Yields the binomial coefficient n-choose-k.
// Assumes that 0<=k<=n.
public static long binCoeff(int n, int k)
{
long y = 1;
if (k>n/2)
// It pays to compute n-choose-(n-k) so reset k.
{k=n-k;}
for(int j=0;j<k;j++)
{y = (y*(n-j))/(j+1);} // y is n-choose-j
return y;
}
// The pow Method = 2 points correctness + 1 point style
// 1 point for loop range, 1 point for loop body
// -1 style if correct but change output or input type to double
// -1 style inadequate specification (must say n nonnegative)
// -1 style if NO comments to help follow what the loop is doing.
// Yields x raised to the nth power.
// Assumes that n is nonnegative.
public static double pow(double x,int n)
{
double y = 1;
for(int k=1;k<=n;k++)
{y = y*x;} // y is x-to-the-k
return y;
}
// The stirling method = 1 point correctness + 1 point style
// -1 style if inadequate specification (should say n nonnegative but ok not to)
// Yields Stirling's approximation to n!
// Assumes n is nonnegative.
public static double stirling(int n)
{
if (n==0)
{return 1.0;}
else
{return sqrt(2*PI*n)*pow(n/E,n);}
}
// The binCoeffAppx method = 1 point correctness + 1 point style
// -1 style if inadequate specification (must say 0<=k<=n))
// Yields an approximation to the binomial coefficient n-choose-k.
// Assumes that 0<=k<=n.
public static double binCoeffApprx(int n, int k)
{
return stirling(n)/(stirling(k)*stirling(n-k));
}
}
P3A.java Output:
The square root of one million = 1000.000000000000000 The absolute value of -10 is 10.0 The absolute value of 10 is 10.0 The number of possible 5-card poker hands = 2598960 The binomial coefficient 52-choose-47 = 2598960 The 50th power of two = 1125899906842624 The Stirling approximation to 5! = 118.01916795758895 The approximate number of 5-card poker hands = 2643031 An approximation to 100-choose-30 = 2.9464561071296764E25
P3B
// P3B = 1 points correctness + 1 point style
// -1 style if output table really bad.
// -1 correctness if the binCoeff implementation done in a way that results in
// integer arithmetic overflow.
// Warning but no points off if 4-choose-2 not out of loop
// P3B: The probability of having exactly one pair in an n-card poker hand.
import java.io.*;
public class P3B
{
public static void main(String args[])
{
TokenReader in = new TokenReader(System.in);
System.out.println("P is the probability of having exactly one pair in");
System.out.println("an n-card hand.\n");
System.out.println(" n P");
System.out.println("----------------------");
double factor = 13.0*MyMath.binCoeff(4,2); // A common factor in the probabilities.
double prob; // The probability pn.
for(int n=2;n<=14;n++)
{
prob = factor*MyMath.binCoeff(12,n-2)*MyMath.pow(4,n-2)/(double) MyMath.binCoeff(52,n);
Format.print(System.out,"%3d ",n);
Format.println(System.out," %10.4f",prob);
}
in.waitUntilEnter();
}
}
P3B Output:
P is the probability of having exactly one pair in an n-card hand. n P ---------------------- 2 0.0588 3 0.1694 4 0.3042 5 0.4226 6 0.4855 7 0.4728 8 0.3923 9 0.2751 10 0.1599 11 0.0745 12 0.0262 13 0.0062 14 0.0007