1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
#include <iostream>
// invariant: n! is within the range of unsigned int
unsigned int factorial( unsigned int n )
{ return n < 2 ? 1 : n * factorial(n-1) ; }
void factorial_byref( unsigned int n, unsigned int& result ) { result = factorial(n) ; }
// invariant: n != 0
unsigned int div_count( unsigned int n )
{
if( n == 1 ) return 1 ;
unsigned int cnt = 2 ; // 1 and n are divisors
for( unsigned int div = 2 ; div <= (n/2) ; ++div ) if( n%div == 0 ) ++cnt ;
return cnt ;
}
void div_count_byref( unsigned int n, unsigned int& result ) { result = div_count(n) ; }
// invariant: a <= b , sum is within the range of unsigned int
unsigned int ev_sum( unsigned int a, unsigned int b )
{
if( a%2 != 0 ) return ev_sum( a+1, b ) ;
// invariant: here, a is an even number
unsigned int sum = 0 ;
for( ; a <= b ; a += 2 ) sum += a ;
return sum ;
}
void ev_sum_byref( unsigned int a, unsigned int b, unsigned int& result ) { result = ev_sum(a,b) ; }
int main()
{
unsigned int n = 8 ;
std::cout << "factorial(" << n << ") == " << factorial(n) << '\n' ;
unsigned int fact ;
factorial_byref( n, fact ) ;
std::cout << "fact == " << fact << '\n' ;
///////////////////////////////////////////////////
n = 100 ; // divisors are 1, 2, 4, 5, 10, 20, 25, 50, 100
std::cout << "div_count(" << n << ") == " << div_count(n) << '\n' ;
unsigned int dcnt ;
div_count_byref( n, dcnt ) ;
std::cout << "dcnt == " << dcnt << '\n' ;
///////////////////////////////////////////////////
unsigned int a = 23 ;
unsigned int b = 23 ;
std::cout << "ev_sum( " << a << ", " << b << " ) == " << ev_sum(a,b) << '\n' ;
b = 24 ;
std::cout << "ev_sum( " << a << ", " << b << " ) == " << ev_sum(a,b) << '\n' ;
a = 1 ;
b = 201 ;
std::cout << "ev_sum( " << a << ", " << b << " ) == " << ev_sum(a,b) << '\n' ;
// 2 + 4 + ... + 200 == 2 * ( 1 + 2 + ... + 100 ) == 2 * 100 * 101 / 2 == 100 * 101 == 10100
unsigned int sum ;
ev_sum_byref( a, b, sum ) ;
std::cout << "sum == " << sum << '\n' ;
}
|