地址:http://ac.jobdu.com/problem.php?pid=1514
题目1514:数值的整数次方
-
题目描述:
-
给定一个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
-
提示:
-
请特别注意不同的编译器对于科学计数法格式输出中指数位数的差别。建议使用九度Online Judge所使用的编译环境。
考察点:
1、基底为0,指数为负数
2、需要对基底和指数(>0,<0,=0)分类计算
3、输出格式%.2ef,基底——小数点后保留两位的科学计数法,数字末尾添加“ f ”
方法一:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
bool equal(double num1, double num2) {
if ((num1 - num2 < 0.00000001) && (num1 - num2 > -0.00000001))
return true;
else
return false;
}
int main(){
int t;
while(scanf("%d", &t) != EOF) {
while(t --) {
double base = 0.0;
int exponent = 0;
scanf("%lf %d", &base, &exponent);
if(exponent == 0) {
double multiply = 1.0;
printf("%.2ef\n", multiply);
continue;
}
else if(exponent < 0) {
if(equal(base, 0.0)) {
printf("INF\n");
continue;
}
else {
double multiply = 1.0;
for(int i = 0; i < abs(exponent); i ++)
multiply *= base;
printf("%.2ef\n", 1 / multiply);
}
}
else if(exponent > 0) {
if(equal(base, 0.0)) {
double multiply = 0.0;
printf("%.2ef\n", multiply);
continue;
}
else {
double multiply = 1.0;
for(int i = 0; i < abs(exponent); i ++)
multiply *= base;
printf("%.2ef\n", multiply);
}
}
}
}
return 0;
}
/**************************************************************
Problem: 1514
Language: C++
Result: Accepted
Time:80 ms
Memory:1020 kb
****************************************************************/
方法二:递归
2的32次方 = 2的16次方 * 2的16次方
2的16次方 = 2的8次方 * 2的(16 / 2)次方
2的5次方 = 2的平方 * 2的平方 * 2的1次方
#include <stdio.h>
//浮点数比较大小
bool equal(double num1, double num2) {
if((num1 - num2) > -0.00000001 && (num1 - num2) < 0.00000001)
return true;
else
return false;
}
double recursion(double base, int exponent) {
if(exponent == 0)
return 1;
else if(exponent == 1)
return base;
double result = recursion(base, exponent >> 1);//右移一位相当于除以2
result *= result;
if (exponent & 0x1 == 1)//判断exponent奇偶性
result *= base;
return result;
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
double base;
int exponent;
while(n --) {
scanf("%lf %d", &base, &exponent);
if(exponent == 0) {
printf("%.2ef\n", 1.0);
continue;
}
else if(exponent < 0) {
if(equal(base, 0.0)) {
printf("INF\n");
continue;
}
double result = 1 / recursion(base, -exponent);
printf("%.2ef\n", result);
}
else if(exponent > 0) {
if(equal(base, 0.0)) {
printf("%.2ef\n", 0.0);
continue;
}
double result = recursion(base, exponent);
printf("%.2ef\n", result);
}
}
}
return 0;
}
/**************************************************************
Problem: 1514
Language: C++
Result: Accepted
Time:80 ms
Memory:1020 kb
****************************************************************/