11--数值的整数次方

/*
题目:数值的整数次方。
    实现:double Power(double base, int exponet);
    求base的exponet次方。不得使用库函数,同时不需要考虑大数问题。

解题思路:
    注意两个问题:
        (1):计算机中的float和double是有偏差的,一般 1.0 != 1.0.所以如果想计算就要写 abs(a - b) < 0.000001 就可以。
        (2):要考虑边界条件:(a),底数是0或者1,次方是负数。

优化:
    这里求a的b次方是可以优化的。
    举例:10的20次方。就等于10的10次方 乘以 10的10次方。
    可以减少一半的计算量。
    并且分奇数和偶数。用位操作。超过了除法的速度。

*/

#include <stdio.h>

//判断两个数值是否相等
int equal(double base, int number)
{
    if ((base - number > 0 && base - number < 0.0000001) || (base - number < 0 && base - number > -0.0000001))
        return 1;
    else
        return 0;

}

double countNumPower(double base, int num)
{
    printf("%d , %f\n",num, base);
    double result = 1.0;
    for (int i = 1; i <= num; i++)
        result *= base;

    return result;
}

//优化的计算次方。
double fastPowerCount(double base, int num)
{
    if (exponet == 0)
        return 1;
    if (exponet == 1)
        return base;

    //这里右移一位,比/2快。
    double result = fastPowerCount(base, num >> 1);
    result *= result;
    if (exponet & 0x1 == 1)        //这里判断最后一个是否是1,也就是奇数。
        result *= base;

    return result;

}

//次方
double Power(double base, int exponet)
{
    if (equal(base, 0.0) && exponet < 0)
    {
        printf("输入错误:base 等于0,并且整数次方小于0.\n");
        return -1.0;
    }

    //认为任何数值的0次方都是1
    if (exponet == 0)
        return 1.0;

    // 当是基数是0或者1的时候,就是返回当前值。认为他们的任何次方都是其本身。
    if (equal(base, 0.0) || equal(base, 1.0))
    {
        printf("base %f\n", base);
        return base;
    }

    if (exponet > 0)
    {

        return countNumPower(base, exponet);
    }
    else if (exponet < 0)        //如果次方数是负数,就取倒数。
    {

        return 1.0/countNumPower(base, -exponet);
    }

}

//测试程序
void test(double base, int exponet)
{
    printf("%f\n", Power(base, exponet));
}

int main()
{
    test(0.0, 1);
    test(1.0, 1);
    test(2, 1);
    test(3, 3);
    test(4, 3);
    test(1.5, 3);
    test(0.5, 3);
    test(10, -2);

    return 0;

}
时间: 2024-08-10 21:29:53

11--数值的整数次方的相关文章

剑指offer (11) 数值的整数次方

利用create groups for any added folders 这样的方式表示的是将所有的资源都放在资源包得路径下,没有层次的概念利用create folder references for any added folders这样的表示方式是在按照原来文件夹的方式将他们放入到安装包中的.在安装包中有几个这样的文件夹:(这些文件都是位于家路径下的)(1)Documents: 该文件夹用于程序数据文件写入到该目录下,用于存储用户数据以及需要备份的数据.(2)Library:include

【剑指offer】数值的整数次方

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25506085 剑指offer上的第十一题,九度OJ上测试通过. 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表示测试案例的数目,接下来的T行每行输入一个浮点数base和一个整数exponent,两个数中间用一个空格隔开. 输出: 对应每

数值的整数次方-剑指Offer

数值的整数次方 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路 主要有几点需要注意 由于计算机表示小数(float和double)都有误差,不能直接用等号(==)判断两个小数是否相等.若两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等 注意考虑输入值得全面性,正负可能,而且0的负数次幂没意义. 代码 解法一: public class Solution { public double Powe

《剑指Offer》题目:数值的整数次方

题目描述:数值的整数次方给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目分析:题目的关键在于要考虑exponent为负数的情况. Java代码: public class Power { public static double power(double base, int exponent) { double res = 1.0; if(exponent == 0){ return 1.0; } if(exponent > 0

[剑指offer]Q11:数值的整数次方

pow(base, exponent) 考虑一下几种情况: base = 0, 那么直接返回0 base = 1, 那么直接返回1 exponent = 0, 那么直接返回1, 注意base= 0 exponent = 1, 那么直接返回 base exponent  为正为负 的情况 主要考察的点是将问题缩减,用折半的思想.这个题细节还是很多的,为了便于验证,leetcode上恰好有这个题,建议在线AC一下. def equal(self, a, b): return abs(a - b) <

数值的整数次方(C++ 和 Python 实现)

(说明:本博客中的题目.题目详细说明及参考代码均摘自 "何海涛<剑指Offer:名企面试官精讲典型编程题>2012年") 题目 实现函数 double Power(double base, int exponent),求 base 的 exponent 次方.不得使用库函数,同时不需要考虑大数问题. 算法设计思想 无论是简单直接方法,还是高效的方法,都需要首先全面考虑 base 和 exponent 的可能的输入:正数.负数和 0.实现的基本思想是把数值的整数次方,转化为数

c++实现数值的整数次方(类似pow())作用

/* * 计算数值的整数次方.cpp * * Created on: 2018年4月13日 * Author: soyo */ #include<iostream> #include<math.h> #include<ctime> using namespace std; int main() { double power(double base,int exp); int x=2,y=3; long int z; z=pow(2,3); cout<<&qu

剑指Offer--第16题 数值的整数次方

第16题 数值的整数次方 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路 看到有点懵,第一感觉觉得是不是应该考虑0的0次或者负数情况,还有就是浮点类型没办法使用"="号,最后自己以偷懒的方式直接调用Java的API,如果面试题中不让调用库函数,那么基本上这题就是挂了可能. 以上题目描述来自牛客,没有对使用做限制.真正的剑指offer上有限制条件不得使用库函数,同时不需要考虑大数问题. 自己的low代码 publ

面试题16:数值的整数次方

// 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考虑大数问题. 解题思路: 解题并不难,重要的是要考虑到输入的各种情况,并且有相应的处理. double和int都是可以取负数和0的,如果base取0,exponent<0,结果显然是不存在的. base取0,exponent取非负,直接返回1就可以了. 其他情况,正常运算就好,要注意如果expo

《剑指offer》第十六题(数值的整数次方)

// 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考虑大数问题. #include <iostream> #include <cmath> using namespace std; bool g_InvalidInput = false;//使用全局变量作为错误处理方式 bool equal(double num1, double nu