劍指Offer之數值的整數次方
- 題目描述:
-
給定一個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所使用的編譯環境。
/*********************************
* 日期:2013-11-9
* 作者:SJF0115
* 題號: 題目1514:數值的整數次方
* 來源:https://ac.jobdu.com/problem.php?pid=1514
* 結果:AC
* 來源:劍指Offer
* 總結:
**********************************/
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int flag = 1;
//判斷double類型數據是否相等
int equal(double n,double m){
if((n - m) > -0.0000001 && (n - m) < 0.0000001){
return 1;
}
else{
return 0;
}
}
double Power(double n,int exponent){
int i;
double result = 1.0;
//0^負數次方
if(equal(n,0.0) && exponent < 0){
flag = 0;
return 0.0;
}
else{
flag = 1;
int absExponent = exponent;
if(exponent < 0){
absExponent = - exponent;
}
for(i = 0;i < absExponent;i++){
result *= n;
}
if(exponent < 0){
result = 1.0 / result;
}
return result;
}
}
int main()
{
int i,n,num,exponent;
double base;
while(scanf("%d",&n) != EOF){
for(i = 0;i < n;i++){
scanf("%lf %d",&base,&exponent);
double result = Power(base,exponent);
if(flag == 0){
printf("INF\n");
}
else{
printf("%.2ef\n",result);
}
}
}
return 0;
}

【另一種方法】



/*********************************
* 日期:2013-11-9
* 作者:SJF0115
* 題號: 題目1514:數值的整數次方
* 來源:https://ac.jobdu.com/problem.php?pid=1514
* 結果:AC
* 來源:劍指Offer
* 總結:
**********************************/
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int flag = 1;
//判斷double類型數據是否相等
int equal(double n,double m){
if((n - m) > -0.0000001 && (n - m) < 0.0000001){
return 1;
}
else{
return 0;
}
}
double PowerOfPositive(double base,int exponent){
if(exponent == 0){
return 1;
}
else if(exponent == 1){
return base;
}
else{
//右移一位相等於除以2
double result = PowerOfPositive(base,exponent >> 1);
result *= result;
//判斷奇偶性
if(exponent & 0x1 == 1){
result *= base;
}
return result;
}
}
double Power(double n,int exponent){
int i;
double result = 1.0;
//0^負數次方
if(equal(n,0.0) && exponent < 0){
flag = 0;
return 0.0;
}
else{
flag = 1;
int absExponent = exponent;
if(exponent < 0){
absExponent = - exponent;
}
result = PowerOfPositive(n,absExponent);
if(exponent < 0){
result = 1.0 / result;
}
return result;
}
}
int main()
{
int i,n,num,exponent;
double base;
while(scanf("%d",&n) != EOF){
for(i = 0;i < n;i++){
scanf("%lf %d",&base,&exponent);
double result = Power(base,exponent);
if(flag == 0){
printf("INF\n");
}
else{
printf("%.2ef\n",result);
}
}
}
return 0;
}
最後更新:2017-04-03 14:54:08