C语言求幂计算的高效解法

本文实例演示了C语言求幂计算的高效解法。很有实用价值。分享给大家供大家参考。具体方法如下:

题目如下:

给定base,求base的幂exp

只考虑基本功能,不做任何边界条件的判定,可以得到如下代码:

#include <iostream>

using namespace std;

int cacExp(int base, int exp)
{
 int result = 1;
 int theBase = 1;
 while (exp)
 {
 if (exp & 0x01)
  result = result * base;
 base = base * base;
 exp = exp >> 1;
 }

 return result;
}

int getRecurExp(int base, int exp)
{
 if (exp == 0)
 {
 return 1;
 }

 if (exp == 1)
 {
 return base;
 }

 int result = getRecurExp(base, exp >> 1);
 result *= result;
 if (exp & 0x01)
 result *= base;

 return result;
}

int main()
{
 for (int i = 1; i < 10; i++)
 {
 int result = cacExp(2, i);
 //int result = getRecurExp(2, i);
 cout << "result: " << result << endl;
 }

 return 0;
}

再来看看数值的整数次方求解方法:

#include <iostream>

using namespace std;

bool equalZero(double number)
{
 if (number < 0.000001 && number > -0.000001)
 return true;
 else
 return false;
}

double _myPow(double base, int exp)
{
 if (exp == 0)
 return 1;
 if (exp == 1)
 return base;

 double result = _myPow(base, exp >> 1);
 result *= result;
 if (exp & 0x01)
 result *= base;

 return result;
}

double _myPow2(double base, int exp)
{
 if (exp == 0)
 return 1;

 double result = 1;
 while (exp)
 {
 if (exp & 0x01)
  result *= base;
 base *= base;
 exp = exp >> 1;
 }

 return result;
}

double myPow(double base, int exp)
{
 if (equalZero(base))
 return 0;
 if (exp == 0)
 return 1;

 bool flag = false;
 if (exp < 0)
 {
 flag = true;
 exp = -exp;
 }

 double result = _myPow2(base, exp);
 if (flag)
 {
 result = 1 / result;
 }

 return result;
}

void main()
{
 double base = 2.0;
 int exp = -5;

 double result = myPow(base, exp);
 cout << "result: " << result << endl;
}

相信本文所述对大家C程序算法设计的学习有一定的借鉴价值。

(0)

相关推荐

  • 北邮计算机考研复试题的C语言解答精选

    二进制数 题目 题目描述:      大家都知道,数据在计算机里中存储是以二进制的形式存储的.      有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的.      你能帮帮小明吗?并且,小明不想要二进制串中前面的没有意义的0串,即要去掉前导0.      输入:      第一行,一个数字T(T<=1000),表示下面要求的数字的个数.      接下来有T行,每行有一个数字n(0<=n<=10^8),表示要求的

  • C语言科学计算入门之矩阵乘法的相关计算

    1.矩阵相乘 矩阵相乘应满足的条件: (1) 矩阵A的列数必须等于矩阵B的行数,矩阵A与矩阵B才能相乘: (2) 矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数: (3) 矩阵C中第i行第j列的元素等于矩阵A的第i行元素与矩阵B的第j列元素对应乘积之和,即 如: 则: 2. 常用矩阵相乘算法     用A的第i行分别和B的第j列的各个元素相乘求和,求得C的第i行j列的元素,这种算法中,B的访问是按列进行访问的,代码如下: void arymul(int a[4][5], int b[

  • C语言中字符的输入输出以及计算字符个数的方法详解

    C语言字符输入与输出 标准库提供的输入/输出模型非常简单.无论文本从何处输入,输出到何处,其输入/输出都是按照字符流的方式处理.文本流是由多行字符构成的字符序列,而每行字符则由 0 个或多个字符组成,行末是一个换行符.标准库负责使每个输入/输出流都能够遵守这一模型.使用标准库的 C 语言程序员不必关心在程序之外这些行是如何表示的. 标准库提供了一次读/写一个字符的函数,其中最简单的是 getchar 和 putchar 两个函数.每次调用时,getchar 函数从文本流中读入下一个输入字符,并将

  • C语言实现直角坐标转换为极坐标的方法

    本文实例讲述了C语言实现直角坐标转换为极坐标的方法.分享给大家供大家参考,具体如下: #include<stdio.h> #include<math.h> struct complex_s{ double x,y; }; double real_part(struct complex_s z){ return z.x; } double img_part(struct complex_s z){ return z.y; } double magnitude(struct compl

  • C语言实现计算树的深度的方法

    本文实例讲述了C语言实现计算树的深度的方法.是算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> using namespace std; struct Node { Node(int i = 0, Node *l = NULL, Node *r = NULL) : data(i), left(l), right(r) {}

  • C语言中计算正弦的相关函数总结

    C语言sin()函数:正弦函数 头文件: #include <math.h> sin() 函数用来求给定值的正弦值,其原型为: double sin(double x); [参数]给定的值(弧度). [返回值]返回-1 至1 之间的计算结果. 弧度与角度的关系为: 弧度 = 180 / π 角度 角度 = π / 180 弧度 使用 rtod( ) 函数可以将弧度值转换为角度值. 注意,使用 GCC 编译时请加入-lm. 举例如下: #include <stdio.h> #incl

  • C语言简单实现计算字符个数的方法

    本文实例讲述了C语言简单实现计算字符个数的方法.分享给大家供大家参考.具体如下: char_counting.c如下: #include<stdio.h> int main() { long nc; nc = 0; while(getchar() != '0') { ++nc; } printf("%ld\n", nc); } 编译和使用下: 复制代码 代码如下: gcc char_counting.c -o char_counting.o 一种通常的调用方式: 复制代码

  • C语言中计算二叉树的宽度的两种方式

    C语言中计算二叉树的宽度的两种方式 二叉树作为一种很特殊的数据结构,功能上有很大的作用!今天就来看看怎么计算一个二叉树的最大的宽度吧. 采用递归方式 下面是代码内容: int GetMaxWidth(BinaryTree pointer){ int width[10];//加入这棵树的最大高度不超过10 int maxWidth=0; int floor=1; if(pointer){ if(floor==1){//如果访问的是根节点的话,第一层节点++; width[floor]++; flo

  • 安装OpenMPI来配合C语言程序进行并行计算

    安装OPENMPI 由于是实验,也不进行多机的配置了,只在虚拟机里安装吧.多个机器的配置可以参考此文 最简单的方法,apt安装 sudo apt-get install libcr-dev mpich2 mpich2-doc 测试 hello.c /* C Example */ #include <mpi.h> #include <stdio.h> int main (int argc, char* argv[]) { int rank, size; MPI_Init (&

  • c语言计算三角形面积代码

    复制代码 代码如下: //面积公式s = (a+b+c) / 2   area = sqrt(s * (s - a) * (s - b) * (s - c));//小作业 求三角形的面积 int check(double a);int check2(double a, double b, double c); #include <stdio.h>#include <math.h>int main(void){    double area = 0;    double s;   

  • C语言 坐标移动详解及实例代码

    题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. 输入: 合法坐标为A(或者D或者W或者S) + 数字(两位以内) 坐标之间以;分隔. 非法坐标点需要进行丢弃.如AA10;  A1A;  $%$;  YAD; 等. 下面是一个简单的例子 如: A10;S20;W10;D30;X;A1A;B10A11;;A10; 处理过程: 起点(0,0) + A10 = (

随机推荐