刷题小分队-剑指offer(二)

11. 数值的整数次方

 1 #include <iostream>
 2
 3 int error = 0;
 4 double Power(double base, int exponent);
 5
 6 int main(int argc, char *argv[]) {
 7   double base;
 8   int exponent;
 9   std::cin >> base >> exponent;
10
11   double result = Power(base, exponent);
12
13   std::cout << error << std::endl;
14   std::cout << result << std::endl;
15 }
16
17 double Power(double base, int exponent) {
18   if(0 == exponent)
19     return 0;
20   if(exponent > 0) {  // 指数为正
21     if(1 == exponent)
22       return base;
23     if(exponent % 2 == 0) { // 偶数
24       double tmp = Power(base, exponent/2);
25       return tmp*tmp;
26     } else {  // 奇数
27       double tmp = Power(base, (exponent-1)/2);
28       return tmp*tmp*base;
29     }
30   } else {  // 指数为负
31     if(base == 0) {
32       error = -1;
33       return 0;
34     }
35     if(-1 == exponent)
36       return 1/base;
37     if(exponent % 2 == 0) {  // 偶数
38       double tmp = Power(base , exponent/2);
39       return tmp*tmp;
40     } else {  // 奇数
41       double tmp = Power(base , (exponent+1)/2);
42       return tmp*tmp*(1/base);
43     }
44   }
45 }

*book:

 1 #include <iostream>
 2
 3 bool error = false;
 4 double Power(double base, int exponent);
 5 double PositivePower(double base, unsigned int exponent);
 6 bool equal(double m, double n);
 7
 8 int main(int argc, char *argv[]) {
 9   double base;
10   int exponent;
11   std::cin >> base >> exponent;
12
13   double result = Power(base, exponent);
14
15   std::cout << error << std::endl;
16   std::cout << result << std::endl;
17 }
18
19 double Power(double base, int exponent) {
20   // 底数为0, 指数为负数/0/正数
21   if(equal(base, 0.0)) {
22     if(exponent < 0) {
23       error = true;
24       return 0;
25     } else
26       return 0;
27   }
28
29   //指数为正数/0
30   unsigned int absexponent = (unsigned int) exponent;
31   if(exponent < 0) {
32     absexponent = (unsigned int)(-exponent);
33   }
34   double result = PositivePower(base, absexponent);
35   return (exponent < 0) ? 1/result : result;
36 }
37
38 bool equal(double m, double n) {
39   if(m-n < 0.0000001 && m-n > -0.0000001)
40     return true;
41   return false;
42 }
43
44 double PositivePower(double base, unsigned int exponent) {
45   if(exponent == 1)
46     return base;
47   if(exponent == 0)
48     return 0;
49   double result = PositivePower(base, exponent >> 1);
50   result *= result;
51   if(exponent & 0x1 == 1)  // 奇数
52     result *= base;
53   return result;
54 }

思路:利用乘方的性质

本题看似简单,但完美的写出程序需要思考全面:

1)底数/指数分别为0,负数,正数的情形;(a的n次幂是a的-n次幂的倒数,利用此点可简化程序)

2)底数判断是否为0的方法(double base== 0错误);

时间: 2024-11-05 11:47:09

刷题小分队-剑指offer(二)的相关文章

二维数组的查找,刷题成功——剑指Offer

今天又做了一道题目,通过啦,欧耶! https://www.nowcoder.net/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.

剑指OFFER 二叉搜索树的后序遍历

剑指OFFER 二叉搜索树的后序遍历 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析 判断是否是二叉搜索树的后序遍历结果,那么得先明白什么是二叉搜索树,还有什么是后序遍历 这是一颗二叉搜索树,其每个节点都满足 左孩子<父母<右孩子 其后序遍历为 4 7 5 10 12 11 9 [ 小][ 大 ][中] 然后小部分/大部分内部也同样满足这样的规律,那么,用递归是最方便的 代码 class

leetcode 338. Counting Bits,剑指offer二进制中1的个数

leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种方法,利用奇偶性找规律 class Solution { public: vector<int> countBits(int num) { vector<int> result{0}; for(int i = 1;i <= num;i++){ if(i % 2 == 0) res

剑指offer(二十三,二十四,二十五)最小的k个数,连续子数组的最大和,链表中环的入口节点

23:最小的k个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 简单题.... function GetLeastNumbers_Solution(input, k) { if(k>input.length) return []; let ans = []; input = input.sort(); //console.log(input.join("").slice(0,4).split

剑指offer——二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出true,否则输出false.假设输入的数组的任意两个数字都不相同. 思路:首先二叉搜索树是指左子树全部小于根节点,右子树全部大于根节点的树.故: 对于一棵树:首先找到右子树的第一个节点,然后判断右子树中是否有小于根节点的节点,若有,则输出false. 1 public class Solution { 2 public boolean VerifySquenceOfBST(int [] sequence) { 3

[剑指offer] 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入描述 一个整数 输出描述 该数二进制表示中1的个数 题目分析 解法一 运行时间:29m 占用内存:629k public int NumberOf1(int n) { String s=Integer.toBinaryString(n); char[] c=s.toCharArray(); int j=0; for(int i=0;i<c.length;i++){ if(c[i]=='1'){ j++; } } re

剑指offer 二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路:迭代版本: 核心思想是中序遍历,头结点需要单独设置flag变量进行初始化. if(!s.empty()){ if(flag == 1){ head = s.top(); cur = s.top(); s.pop(); cur -> left = pre; pre -> right = cur; pre = pre -> right; flag = 0; }

剑指offer(二十六)之数组中重复的数字

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 思路一: 用冒泡的思想,当遇到相等的元素的时候,将它放到duplication[0]当中,并将标志tag,改为true <span style="font-family:SimSun;font-size:18px;&

剑指offer—二进制中1的个数

题目: 实现一个函数,输入一个整数,输出该数二进制表示中1的个数.如9的二进制是1001,因此输入9输出2. 解法一:可能死循环 int num1(int n) { int count =0; while(n) { if(n&1) count++; n=n>>1; } return count; } 上面的函数如果输入一个负数,如果一直做右一运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环. 解法二:无死循环但效率低 int num1(int n) { int count =