/* mypow.c * Code example for CP264 Data Structures II * Computing the power * HBF */ #include // time: O(log n), space: O(1) int ipow(int b, int n) { int r = 1; while (n>0) { if (n & 1) r *= b; n >>= 1; b *= b; } return r; } // b^n = b^(n/2 * 2 + n%2) // time: O(log n), space: O(log n) int ipow_recursive(int b, int n) { int r = 1; if (n>0) { r = ipow_recursive(b*b, n>>1); if (n & 1) r *=b; } return r; } // time: O(n), space: O(1) int ipow_slow(int b, int n) { int r = 1; while (n>0) { r *= b; n--; } return r; } float fpow(float b, int n) { float r = 1.0; while (n>0) { if (n & 1) r *= b; n >>= 1; b *= b; } return r; } double dpow(double b, int n) { double r = 1.0; while (n>0) { if (n & 1) r *= b; n >>= 1; b *= b; } return r; } int main(){ int b=2, i, m = 10; printf("power by int type:\n"); for (i = 0; i< m; i++) { printf("power(%d, %d)=%d\n", b, i, ipow(b, i)); } printf("power by int type recursion:\n"); for (i = 0; i< m; i++) { printf("power(%d, %d)=%d\n", b, i, ipow_recursive(b, i)); } printf("power by int slow:\n"); for (i = 0; i< m; i++) { printf("power(%d, %d)=%d\n", b, i, ipow_slow(b, i)); } printf("power by single precision floating type:\n"); float fb=2.0; for (i = 0; i< m; i++) { printf("power(%f, %d)=%f\n", fb, i, fpow(fb, i)); } printf("power by double precision floating type:\n"); double db = 2.0; for (i = 0; i