[TOC]

一、实现指数函数pow

50. Pow(x, n)(中等函数)

剑指 Offer 16. 数值的整数次方(中等函数)

class Solution {
public:
    // x的n次幂等于n个x相乘,请注意,n可能为负数
    // 直接使用while循环,n非常大时会超时,所以需要用快速幂的位运算
    // 同时注意n可能是一个极大的负数,转换为long
    double myPow(double x, int n) {
        if(x==0.0f) return 0.0f;// 0的任何幂都设为0
        if(x==1.0f) return 1.0f;// 1的任何幂都设为1
        double res=1.0f;
        // 特殊情况:n为负数
        long b = n;//排除n为极大的负数
        if(b<0){
            x=1/x;
            b=-b;
        }
        // 快速幂算法的位运算版本
        while(b){
            if(b&1==1) res=res*x;//如果b是奇数,则res直接*x
            x=x*x;//x自乘
            b>>=1;//b右移1位,相当于/2
        }
        return res;
    }
};

二、n位数

剑指 Offer 17. 打印从1到最大的n位数(简单难度)

class Solution {
public:
    /*本题的难点在于n的增加,会让结果数组指数级增加:
    n=1,只有9个数;n=2,就有99个数;n=3,就有999个数
    所以n=n时,推理有n个9位数的数
    这道题返回一个int数组,测试数据也没有溢出
    如果让返回一个int数,可能存在溢出的情况,则难度会提升。
    */
    vector<int> printNumbers(int n) {
        // 计算需要多少个数
        int sum = 1;
        for (int i = 0; i < n; i++) sum *= 10;
        // 向结果数组中添加数字
        vector<int> res(sum - 1);
        for(int i = 0; i < sum - 1; i++) res[i] = i + 1;
        return res;
    }
};