• 数值的整数次方


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

    这道题目有以下几点需要注意:

    1. 0的0次方在数学上是没有意义的,因此无论是输出1还是0都是可以接受的,本题选择输出1
    2. 0的负数次方相当于0作为除数,也是无意义的,非法输入
    3. base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒数
    4. 判断double类型的base是否等于0不能使用==号。因为计算机表述小树(包括float和double型小数)都有误差,不能直接使用等号(==)判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个double类型的数相等。

    根据以上4个注意点,我们可以写出求指数的程序,代码如下: 

     1 #include<iostream>
     2 #include<stdlib.h>
     3 using namespace std;
     4 
     5 //全局变量,测试时检查它,用于判断输入正确与否 
     6 bool g_InvalidInput = false;
     7 
     8 //由于精度原因,double类型的变量不能用等号判断两个数是否相等,因此需要写equsl函数
     9 bool equal(double num1, double num2)
    10 {
    11     if((num1 - num2)>-0.0000001 && (num1 - num2) < 0.0000001)
    12         return true;
    13     else
    14         return false;
    15 }
    16 
    17 //方法1采用循环  
    18 double PowerWithUnsignedExponent(double base, unsigned int exponent)
    19 {
    20     double result = 1.0;
    21     for(int i = 1; i<=exponent; ++i)
    22         result *= base;
    23 
    24     return result;
    25 }
    26 
    27 //方法2 采用递归 
    28 double PowerWithUnsignedExponent1(double base, unsigned int exponent)
    29 {
    30     if(exponent == 0)
    31         return 1;
    32     if(exponent == 1)
    33         return base;
    34 
    35     //位运算代替除以2,位运算的效率比乘除法及求余运算的效率要高很多 
    36     double result = PowerWithUnsignedExponent1(base, exponent >> 1);
    37     result *= result;
    38 
    39     if(exponent & 0x1 == 1) //位与,代替求余%来判断一个数是奇数还是偶数 
    40         result *= base;
    41         
    42     return result ;
    43 }
    44 
    45 double Power(double base, int exponent)
    46 {
    47     g_InvalidInput = false;
    48 
    49     //如果底数为0且指数小于0,则表明是非法输入。
    50     if(equal(base, 0.0) && exponent < 0)
    51     {
    52         g_InvalidInput = true;   //此时全局变量变为true 
    53         cout<<"invalid input"<<ends;
    54         return 0.0;
    55     }
    56     
    57     //判断指数正负,取指数的绝对值
    58     unsigned int absExponent = (unsigned int)exponent;
    59     if(exponent < 0)
    60         absExponent = (unsigned int)(- exponent);
    61             
    62     //此处选择使用方法2,使用方法1的话改下代码就可以了。 
    63     double result = PowerWithUnsignedExponent1(base, absExponent);
    64     
    65     //如果指数小于0则取倒数
    66     if(exponent < 0)
    67         result = 1.0 / result;
    68 
    69     return result;
    70 }
    71 int main()
    72 {
    73     double num1=Power(2.0,-2);  //0.25
    74     double num2=Power(2.0, 2);  //4
    75     double num3=Power(0.0, 2);  //0
    76     double num4=Power(0.0, 0);  //无意义,这里选择输出1 
    77     
    78     cout<<num1<<endl;
    79     cout<<num2<<endl;
    80     cout<<num3<<endl;
    81     cout<<num4<<endl;
    82     
    83     cout<<endl;
    84     
    85     //无效输入 返回0 
    86     double num5=Power(0, -2);
    87     cout<<num5<<endl;
    88 
    89     return 0 ;
    90 }

  • 相关阅读:
    jQuery---val方法
    jQuery---内容复习
    jQuery---弹幕效果
    执行插件超过2分钟超时错误,如何办?
    Dynamics 365设置错误通知首选项的方法
    Dynamics 365创建用户提示:您正在尝试使用已由其他用户使用的域登录来创建用户。的解决办法
    导入解决方案错误及其解决办法
    Microsoft Dynamics CRM 2015 and Microsoft Dynamics CRM 2016 Performance and Scalability Documentation
    Dynamics 365测试和启用邮箱时候一直显示“安排电子邮件配置测试”怎么办?
    控制台程序读取Excel设置角色权限
  • 原文地址:https://www.cnblogs.com/sankexin/p/5615360.html
Copyright © 2020-2023  润新知