面试题11 数值的整数次方

地址: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
****************************************************************/


算法参考:http://blog.csdn.net/sunnyyoona/article/details/14646053


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值