zoukankan      html  css  js  c++  java
  • 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
    ",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.
    ");
            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
    ", 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
    ", 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;
    
    }
  • 相关阅读:
    有關window.showModalDialog的應用11/30
    phpmyadmin的查詢不出現10/29
    那點事情我沒有精力做10/17
    水晶報表System.InvalidCastException: 指定的轉換無效11/30
    水晶報表匯出時System.InvalidCastException:指定的格式無效10/29
    读博日记(C#常用开源类库收集
    ASP.net通过JQuery实现Ajax操作
    仿Discuz!的论坛评分发帖弹出提示并渐渐消失的效果
    仿Discuz文本框弹出层的效果
    C#开源资源大汇总
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4842553.html
Copyright © 2011-2022 走看看