Problem Solving (Computing) : CS101 Introduction To Computing

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 35

CS101 Introduction to computing 

Problem Solving
(Computing) 
A. Sahu and S. V .Rao
Dept of Comp. Sc. & Engg.
Dept of Comp. Sc. & Engg.
Indian Institute of Technology Guwahati

1
Outline
• Loop invariant and loop termination
• Many Problem Solving Examples
Man Problem Sol ing E amples
–7 Problems (Solution Method not 
given)
p (So u o e od g e )
–3 problems (Solution Method given)

Reference : R G Dromey, “How to solve it 
f G “ l i
by Computer”, Pearson Education India, 
2009 
2
Problem Solving Example 
• Set A  (Solution Method not given)
1 Nth Power of X 
1. Nh fX
2. Square root of a number 
3. Factorial of N 
4 Reverse a number 
4. Reverse a number
5. Finding value of unknown by  question 
answers 
answers
6. Value of Nth  Fibonacci Number
7. GCD to two numbers
3
Problem Solving Example 
• Set B  (Solution Method given)
1. Finding values Sin(x) using series sum 
2 Value of PI 
2. Value of PI
3. Finding root of a function Bisection  
Methods

4
Problem    1

The nth power of X
The nth power of X
• Problem: Given some  integer x. write a 
program that computes the nth power x, 
where  n is positive integer considerably   
greater than 1.
• Evaluating expression p=xn
Prod=1;
for (i=1; i<=n; i++){
Prod= Prod * x;
}
• Naïve or straight‐forward approach
How many multiplication:  n
y p
Require n steps 
The nth power of X
• Is there any better approach?
• From basic algebra
– if n is even == > Xn = Xn/2.Xn/2
– If n is odd and n=2m+1 ==>  Xn= X2m+1= xm . xm . x 
• From this above fact, can we calculate Xn in fewer 
steps 
• Approach
A h
– Binary representation of n,     
– X23 
23 Example  23=(10111)2=1x2
Example 23=(10111)2=1x24+0x23+1x22+1x21+1x20
= 16+0+4+2+1
– Start from right to left
g
• 1x24+0x23+1x22+1x21+1x20
Approach/Algorithm 
1. Initialize the power sequence and product 
variable   (let initial value of n is n0=n)
Product=1; ProdSequence=x;
2. Do while n > 0 repeat 
p
2.1  if the next most  binary digit of n is one 
then  Product = Product * ProdSecuence;
2.2  n = n /2;
2.3 ProdSecuence *= ProdSecuence;
2.3  ProdSecuence ProdSecuence;

//Invariant Product ProdSecuencen=x^n0 , n>=0
//Invariant Product*ProdSecuence =x^n0 n>=0
Approach
• Binary representation of n,     
• X23 Example  
p
23=(10111)2=1x24+0x23+1x22+1x21+1x20 = 
16+0+4+2+1
• Start from right to left
1x24+0x23+1x22+1x21+1x20
• Approach
Successive generation of x x2, xx4, xx8, xx16, …
– Successive generation of x, x
– Inclusion of the current power member into 
accumulated product when the corresponding
accumulated product when the corresponding 
binary digit is 1
Approach
Before Loop
p
Odd
Odd number or  Right Most Bit
b Ri ht M t Bit

1 0 1 1 1
P=X7.X P=X7 P=X3.X P=X.X2 P=P.PS P=1
16=X23 4
=X3 =X
=X7

X32 X16 X8 X4 X2 PS=X


N=0 N=1 N=2 N=5 N=11 N=23
X23.(X32)0 X7.(X16)1 X7.(X8)2 X3.(X4)5 X.(X2)11 P*PSn
=X23 X23
=X X23
=X =X23 X23
=X =1 X23
=1.X
Loop Invariant
C –Code for Xn
int n, x, Prod, ProdSeq;
// Put code for Input nn, x
Prod=1; ProdSeq=x;
while(n
( > 0)) {
if ((n%2)==1){
Prod=Prod*ProdSeq;
}
n=n/2;
ProdSeq = ProdSeq* ProdSeq;
}
//Put code to Display Prod as Xn
11
Problem    2

The square root problem :  sqrt(X)
The square root problem
• Problem: Write a program that computes the 
square root of a given number.
• Is the problem definition clear?
– If 25 is the input, then 5 is the output
– If 81 is the input, then 9 is the output
– If 42 is the input, then ?
• For
For non perfect squares, the square root is a 
non perfect squares the square root is a
real number
• So the output should be close to the real 
So the output should be close to the real
square root
• How close? to a given accuracy 
How close? to a given accuracy
A more precise specification
p p
• Problem: Write a program that given a 
number m
b outputs a real value r
l l such 
h
that 
– r*r differs from m by a given 
accuracy value e
accuracy value e
• More precisely, the program outputs r
such that 
h h
||r*r ‐ m| < e
|
Solution Strategy
Guess and Correct Strategy:
1 Choose an initial guess r
1. an initial guess r less than m
less than m
2. If r*r > m then keep decreasing r by 1 until r*r
is less than or equal to m
is less than or equal to m.
3. If r*r < m then keep increasing r by 0.1, … until 
rr*rr exceeds or equals m
exceeds or equals m
4. If r*r > m then decrease r by 0.01 until r*r
exceeds or equals m
exceeds or equals m.
...
• Terminate the computation when  r*r equals m
or differs from m by a given small number. 
Idea

olution 
eviation from  Desired square 
esired so root
De
De

Number of Iterations

• Number
Number of iteration depends upon the initial guess
of iteration depends upon the initial guess
• If m is 10,00,000 and the initial guess is 300 then over 
700 steps are needed
• Can we have a better strategy?
Towards a better strategy
• The basic idea of the strategy is to obtain a 
g
series of guesses that
– falls on either side of the actual value
– narrows down closer and closer
narrows down closer and closer
• To make the guess fall on either side
– increase/decrease the guess systematically
the guess systematically
• To narrow the guess
– the amount of increase/decrease is reduced
h f /d d d
• Improving the strategy
– faster ways of obtaining new guess from the old 
one
One Strategy
gy
• Given a guess a for square root of m
– m/a 
/ falls on the opposite side
pp
– (a + m/a)/2, can be the next guess
– Why
Why this guess?  Make next guess closer to sqrt(m) 
this guess? Make next guess closer to sqrt(m)
based on current guess.  
• This gives rise to the following solution
– start with an arbitrary guess, r_0
– generate new guesses r_1, r_2, etc by using the 
averaging formula
averaging formula.
• When to terminate?
– when
when the successive guesses differ by a given small 
the successive guesses differ by a given small
number
The  Approach
Input  float m, e,  assume: m>0, 0<  e > 1
fl
Output float r1, r2

Loop Invariant : 
|( *
|(r2*r2‐m) | <= |(r1*r1‐m)|, |r1‐
) | |( * )| | r2|< e  
|

1. r1 = m/2,  r
/ 2 = r1
2.  Do while (|r1 ‐ r2| > e) steps 2.1 and 2.2
2 1 1 = r2
2.1   r
2.2   r2 = (r1+m/r1)/2
C  Code :  Square root of m 

float
fl t m, e, r1,
1 r2;
2
// Put code for Input m, e
r1=m/2;
r2=r1;
while(abs(r1-r2)
( ( ) > e)
) {
r1=r2;
r2=(r1+m/r1)/2;
}
//Put code to Display root as r2

20
Analysis of the Approach
• Is it correct? Find the loop
p invariant
and bound function
• Can the algorithm be improved?
• More general techniques available
– Numerical analysis
Problem    3

Factorial Computation
Factorial Computation
• Given a number n, compute the factorial 
of n
of n
• Assume n >= 0
• What is factorial?
– 0! = 1, 1! = 1, 2! = 1
0! = 1 1! = 1 2! = 1*2 2 = 2
=2
– 3! = 1*2*3 = 6
– 4! = 1*2*3*4* = 24
* * * *
• n! = 1*2*...*(n‐1)*n, for n>=1
( ) ,
The algorithm/Approach
• Observation: For n>=1, n! is (n‐1)! multiplied by 
n
• Strategy: Given n, compute n! by successively 
computing 1!, 2!, etc. till n!

Input n,  Output
n, Output Fact
1.  initialize fact to  1 and index to 1
2 do while (index < = n) steps 2 1 and 2 2
2.  do  while (index  < = n) steps 2.1 and 2.2
2.1 fact = fact * index
2.2 index = index 
2.2 index  index + 1
1
Analysis of Factorial Algorithm  
• Is the solution correct?
• Loop invariant: At the beginning of each 
p g g
iteration,
– fact holds the partial product 1 
fact holds the partial product 1 * . . . 
. . . * (index
(index‐1)
1)
• When the loop terminates, index = (n+1)
– fact then holds  (1 * ... * n)
fact then holds (1 * * n)
• Does the loop terminate?
– There is a bound function: (n + 1 –
h b df ( index)
d )
– The bound function always >= 0
– It decreases in each iteration
Efficiency Analysis
Efficiency Analysis
• How many operations?
– n multiplications
n multiplications
• Can we do better? 
• Yes, there is a method using (log n) 
Yes there is a method sin (log n)
operations
– The Striling’s
The Striling’s approximation 
approximation
n!=  sqrt(2.π.n). (n/e)n
– Approximated Value (not exact)
i d l ( )
– Square root can be done in log time
Th th power of x can be done time log time
– The n f b d ti l ti
Problem    4

Reversing Digit of a Number
Reversing Digit of a Number
Problem: Reversing the Digits of an integer

Examples:
p
Input:  58902
Output: 20985

Input: 4300
Output: 34
Output: 34
Top Down Strategy
p gy
• The above solution follows the top‐down 
methodology
– Break the problem into two or more sub problems
– Obtain the solutions for the sub problems
p
– 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
Reversing Digit of a Number
Problem: Reversing the Digits of an integer
Examples:
Input:  58902       Output: 20985
( )
R(58902) = 2x10 4+R(5890)  
( )
// you need to know how many digit before hand
2x104+0x10
= 2x10 0x103+R(589)
R(589)
= 2x104+0x103+9x102+R(58)
= 2x104+0x103+9x102+8x101+R(5)
= 2x10 Decreasing
Decreasing 
4 3 2 1 power of 10 
= 2x10 +0x10 +9x10 +8x10 +5 
= 20000+0000+900+80+5
= 20000+0000+900+80+5
Reversing Digit of a Number
Problem: Reversing the Digits of an integer
Examples:
Input:  58902       Output: 20985
( ) (
R(58902) = 2+R(5890)   )
= 2x10+0+R(589)
= (2x10
(2x10+0)x10+9+R(58)
0)x10 9 R(58)
=  ((2x10+0)x10+9)x10+8+R(5)
= (((2x10+0)x10+9)x10+8)x10+5
=  (((2x10+0)x10+9)x10+8)x10+5 Increasing 
Increasing
power of 10 
Approach : Digit Reversal
Input:  N is k digit number to be reversed
Output: 
p RevNum the reversed number
1. q = N
2. RevNum = 0 0
3. Do while (q > 0) steps 3.1,3.2,3.3 
3 1 rem = q mod
3.1 rem = q mod 10
3.2 RevNum = RevNum *10 + rem
33
3.3 q = q / 10
/ 10
Invariant: After jth iteration q={d1}{d2}..{dk‐j} 
and RevNum={d
dR N {dk}{dk‐1}…{d
} {dk‐j‐1}
C  Code  to reverse a number 
int n, RevNum, Rem, q;
// Put code for Input n
q=n;
RevNum=0;
;
while(n != 0) {
Rem = n%10;
RevNum=RevNum*10+ Rem;
n=n/10;
}
//Put code to Display RevNum

33
Analysis of the Approach
y pp
• Is the algorithm correct?
g
• Does it terminate?
– Yes, 
Y
• How many number of iterations?
– Take number of digit time/iteration
• How many number of operations?
How many number of operations?
– Per Iteration: One  mod, 1 mul, 1 add, 1 div 
Thanks

35

You might also like