-
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
时间限制:1 秒
内存限制:128 兆
题目描述:
-
输入:
-
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数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
-
-
分析:主要先排除为INF的特殊情况,再调用pow函数,最后是格式输出(关于科学计数法的格式输出比较少用),如果不能调用pow则需要自己写pow函数。
-
-
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <limits.h> #include <vector> using namespace std; double myPow(double x, int n) { vector<int> nums(32, 0); bool flag = true; double ans = 1.0; if (n < 0) { flag = false; if (n == INT_MIN) { ans = x; n += 1; } n = -n; } int index = 0; int tmp = n; while (n) { if (n & 1 == 1) nums[index] = 1; n >>= 1; ++index; } n = tmp; double tmpAns = x; for (int i = 0; i < index; ++i) { if (nums[i] == 1) ans *= tmpAns; tmpAns *= tmpAns; } return flag ? ans : 1/ans; } int main(void) { int t, exponent; double base; scanf("%d", &t); for (int i = 0; i < t; ++i) { scanf("%lf%d", &base, &exponent); if (base == 0.0 && exponent < 0) printf("INF\n"); else { //double ans = pow(base, exponent); double ans = myPow(base, exponent); printf("%.2ef\n", ans); } } return 0; }