More on Problem Solving
Factorial Computation
•	Given a number n, compute the factorial of n

•	Assume n >= 0

•	What is factorial?
–		0! = 1, 1! = 1, 2! = 1*2 = 2
–		3! = 1*2*3 = 6
–		4! = 1*2*3*4* = 24

•	n! = 1*2*...*(n-1)*n, for n>=1
 The algorithm
•	Observation: For n>=1, n! is (n-1)! multiplied by n

•	Strategy: Given n, compute n! by successively computing 1!, 2!, etc. till n!

Algorithm Fact:
Input n
Output Fact

 1.  initialize fact to  1 and index to 1
 2.  do  while (index  < = n) steps 2.1 and 2.2
              2.1 fact = fact * index
              2.2 index = index + 1
end Fact
Analysis
•	Is the solution correct?

•	Loop invariant: At the beginning of each iteration,
–	fact holds the partial product 1 * . . . * (index-1)

•	When the loop terminates, index = (n+1)
–	 fact then holds  (1 * ... * n)

•	Does the loop terminate?
–	There is a bound function: (n + 1 – index)
–	The bound function always >= 0
–	 It decreases in each iteration

Efficiency Analysis
•	How many operations?
–		n multiplications

•	Can we do better? 

•	Yes, there is a method using (log n) operations
Extracting the digits
Problem: Given a number, list its digits of the number from right to left (How about left to right?)

Example: 
•	 If given number is 50865 then the program 		      should output
			   5,6,8,0,5

•	 If the input is 0 then output is 0

•	 If the input is 7680 the output is 0,8,6,7
Solution?
One Strategy
•	Divide the given number by 10. The remainder is the last digit

•	Divide the quotient by 10. The new remainder is the next last digit

•	Divide the new quotient by 10. The newer remainder is the next last digit

•	and so on.

•	Till no more digits

The Algorithm
Algorithm Digit_Extract:
Input N
Output List 

•	quotient = N
•	do while (quotient > 0) 2.1, 2.2, 2.3
        2.1 divide the quotient by 10 
        2.2 obtain the remainder and the new quotient
        2.3 Add the remainder to List
end Digit_Extract
Analysis of the Algorithm
•	Is the algorithm correct?

•	Does the algorithm terminate?

•	How many operations?
From Digits to Numbers
•	This is the inverse problem
•	 Given a list of digits from, left to right, of a number, obtain the number 

•	Example:  
–	Given 4,7,8 the required number is 478
–	Given 0,8,0,5,6, the required number is 8056

•	Aside: The alternate problem, where the digits are given from right to left order is, less easy.

Solution Strategy
•	Observation:  If the list of digits are 4,7,8 then 
              4  (102) + 7 101 + 8 100 = 478
     the required number 

•	This suggests the following strategy:
–	  Take the first number
–		Multiply by 10 and add it to the next number
–		Multiply the resulting number by 10 and add it 
      to    the next    number
–		and so on
 The algorithm
Algorithm Form_no:
Input: List
Output: d

•	d = the first digit in List
•	do while (next_digit in List) step 2.1 
           2.1 d = 10*d + next_digit
end Form_no

•	Is the algorithm correct?

•	Does it terminate?

•	How many number of operations?
Another Problem
Problem: Reversing the Digits of an integer

Examples:
      Input:  58902
      Output: 20985

      Input: 4300
      Output: 34
Solution Strategy
•	Here is a high level strategy:
–		Extract the list of digits from the number
–		Obtain the new number from the list

•	How do you extract the digits?
–	Use the earlier algorithm

•	How do you obtain the new number?
–	Use the previous algorithm

•	Are the digits reversed?
Top Down Strategy
•	The above solution follows the top-down methodology

–	     Break the problem into two or more sub problems
–	     Obtain the solutions for the sub problems
–	     Combine the solutions to get the solution for the 
         original problem

•	Many Large problems can be solved using top-down approach

•	Obtain the algorithm for the problem using the two previous algorithm
The algorithm for Digit Reversal
Algorithm Digit_Reversal
Input: N, the number to be reversed
Output: M, the reversed number

•	q = N
•	M = 0
•	Do while (q > 0) steps 3.1,3.2,3.3 
       3.1 rem = remainder of q by 10
       3.2 M = M*10 + rem
       3.3 q = quotient of q by 10
end Digit_Reversal
Analysis of the algorithm
•	Is the algorithm correct?

•	Does it terminate?

•	How many number of iterations?

•	How many number of operations?