面试题11

题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

输入:
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,表示测试案例的数目,接下来的T行每行输入一个浮点数base和一个整数exponent,两个数中间用一个空格隔开。

输出:
对应每个测试案例,
输出一个浮点数代表答案,保留两位小数即可。

样例输入:
5
1.0 10
0.0 -5
1.0 0
1.2 5
2.0 -1
样例输出:
1.00e+00f
INF
1.00e+00f
2.49e+00f
5.00e-01f

思路:使用快速幂求幂次。但是指数可能为负数。因此负数转换成整数的相反数。然后特判,考虑底数为0,且指数小于0(错误情况);处理的情况还有指数为0(前面已经处理到了);
版本一:书上(就是快速幂,只不过用递归实现,和快速幂时间效率相等)

/* ***********************************************
Author        :bo-jwolf
Created Time  :2015年02月09日 星期一 12:49:32
File Name     :1514.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define Abs 1e-8
double PowerWithUnsignedExponent( double base, unsigned int exponent ){
	if( exponent == 0 )
		return 1;
	if( exponent == 1 )
		return base;
	double result = PowerWithUnsignedExponent( base, exponent >> 1 );
	result *= result;
	if( exponent & 0x1 == 1 )
		result *= base;
	return result;
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
	int Case;
	double base;
	int exponent;
	while( scanf( "%d", &Case ) != EOF ){
		while( Case-- ){
			scanf( "%lf%d", &base, &exponent );
			bool flag = true;
			if( fabs(base) <= Abs && exponent < 0 )
				flag = false;
			if( flag ){
				bool pos = true;
				if( exponent < 0 ){
					exponent = - exponent;
					pos = false;
				}
				double res = PowerWithUnsignedExponent( base, exponent );
				if( pos )
					printf( "%.2ef\n", res );
				else
					printf( "%.2ef\n", 1.0/res );
			}
			else
				puts( "INF" );
		}
	}
    return 0;
}

版本二:

/* ***********************************************
Author        :bo-jwolf
Created Time  :2015年02月09日 星期一 13:36:23
File Name     :1514a.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define Abs 1e-10
double PowerWithUnsignedExponent( double base, unsigned int exponent ){
	double res = 1.0;
	while( exponent ){
		if( exponent & 1 ){
			exponent--;
			res *= base;
		}
		exponent >>= 1;
		base *= base;
	}
	return res;
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
   int Case;
   double base;
   int exponent;
  while( scanf( "%d", &Case ) != EOF ){
	 while( Case-- ){
			scanf( "%lf%d", &base, &exponent );
			int flag = true;
			if( fabs( base ) <= Abs && exponent < 0 )
				flag = false;
			if( flag ){
				int pos = true; 
				if( exponent < 0 ){
					pos = false;
					exponent = -exponent;
				}
				double res = PowerWithUnsignedExponent( base, exponent );
				if( pos )
					printf( "%.2ef\n", res );
				else
					printf( "%.2ef\n", 1.0 / res );
			}
			else
				puts( "INF" );
	 }
  }
    return 0;
}