• 数值的整数次方


    题目描述

    给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方

    算法注意事项:

    算法并不是很难,但这里要注意对输入的要求进行检查,例如指数是0的情况,底数是0的情况,底数是-1的情况等。所以这里还是要注意很多问题的。下面是代码,从代码中来学习

     1 #include<iostream>
     2 using namespace std;
     3 
     4 bool InvalidInput = false;
     5 /*
     6     这个equal函数需要注意的地方是比较两个double或者float的数时用哪种方法,这里给出了
     7     一种经典的方法, 
     8 */
     9 bool equal(double num1, double num2){
    10     
    11     if((num1 - num2) < 0.0000001 && (num1 - num2) > -0.0000001){
    12         return true;
    13     }
    14     else{
    15         return false;
    16     }
    17 }
    18 
    19 /*
    20     计算指数值的核心算法 
    21 */ 
    22 double powerCore(double base, unsigned int exponent){
    23     if(exponent == 0){      //如果指数是0,那么无论底数是什么,结果都为1,返回即可 
    24         return 1;
    25     }
    26     if(exponent == 1){      //如果指数是1,那么就返回底数本身,因为任何数的1次方还是本身 
    27         return base;
    28     }
    29 /*
    30     递归算法求出结果,这里用到了优化的算法,对指数分奇数和偶数 
    31 */ 
    32     double result = powerCore(base, exponent >> 1);
    33     result *= result;
    34     
    35     if( (exponent & 0x1) == 1){                 //奇数的情况下,需要再乘以底数 
    36         result = result * base;
    37     }
    38     
    39     return result;
    40 }
    41 
    42 double Power(double base, double exponent){
    43     InvalidInput = false;
    44     
    45     if(equal(base, 0.0) && exponent < 0){            //如果底数是0,指数是负数,那么返回标志0.0 
    46         InvalidInput = true;
    47         return 0.0;
    48     }
    49     
    50     unsigned int absExponent = (unsigned int)(exponent);
    51     if(exponent < 0){
    52         absExponent = (unsigned int )(-exponent);           //如果指数是负数,需要先将指数转化为正数 
    53     }
    54     
    55     double result = powerCore(base, absExponent);
    56     
    57     if(exponent < 0){                                       //如果指数是负数,将结果取倒数即可 
    58         result = 1.0 / result;
    59     }
    60     
    61     return result;
    62 } 
    63 
    64 int main(){
    65     /*
    66     写了5组测试的数据 
    67     */
    68 //    double tags = Power(0, -1);
    69 //    double tags = Power(2, -1);
    70 //    double tags = Power(-1, 3);
    71 //    double tags = Power(2, 3);
    72     double tags = Power(9, 0);
    73     if(equal(tags, 0.0)){
    74         cout<<"The invalid input"<<endl;
    75     }
    76     else{
    77         cout<<"the result is "<<tags<<endl;
    78     }
    79     
    80     return 0;
    81 }
  • 相关阅读:
    Mysql如何进行分组,并且让每一组的结果按照某个字段排序,并且获取每一组的第一个字段
    Mysql报错:Packet for query is too large (1121604 > 1048576).You can change this value on the server by setting the max_allowed_packet variable
    JavaScript判断对象有没有定义
    本地设置VirtualBox虚拟机
    Mysql关于时间排序的问题
    PHP实现页面静态化
    301重定向的两种实现方法
    判断浏览器类型
    javascript DOM事件总结
    装饰器模式
  • 原文地址:https://www.cnblogs.com/dormant/p/5326477.html
Copyright © 2020-2023  润新知