整数幂

/**
 * -*- coding : utf-8 -*-
 * @Author : huangshengjianng
 * @Email : 1005542693@qq.com
 * @Date : 2016-08-30 15:56
 * @Last Modified Date : 2016-08-30 19:29
 * @FileName : 整数幂.cpp
 */

/*需求分析 : 
	输入 : 整数x和非负数n
	输出 : 计算x^n的值
	想法1 : 递归计算,将x^n化为x^(n/2)*x^(n/2),在对x^(n/2)再次递归,直到n/k=0(此时x^0=1)为止
	分析 : 要考虑到n是奇数还是偶数,若为偶数,则x^(n/2)*x^(n/2),否则再乘以x
	想法2 : 将n化为二进制计算
	分析 : 从左向右遍历,如果当前二进制数字为0,则对y平方,为1,则对y平方再乘上x.(二进制思想牢记)
 */

#include <iostream>
#include <vector>
using namespace std;


int power(int x,int n){//x表示底数,n表示幂值,返回的是x^n的值
	if (n==0)return 1;//递归基础
	int y=power(x,n/2);//按递归求出x^(n/2)
	y=y*y;
	if (n%2==1)y=x*y;
	return y;
}

//由于n要转换为二进制数字,而计算机表示的最小访问单位为1个字节(8bit),不可再进一步访问bit位.
//需要求解n转换为二进制的大小k和binary[k]
#define BRYSIZE  16
void T2B(int n,int &k,int* binary){//binary数组存放着n的二进制,k是二进制的个数.
	//例如n=5=101B,k=3,则binary[2][1][0]分别为101
	while(n) {
	    binary[k++] = n&0x01;
	    n=n>>1;
	}
}


int exp(int x,int n){//x表示底数,n表示幂值(需要转换为二进制),返回的是x^n的值
	int y=1;
	int k=0;
	int binary[BRYSIZE];
	T2B(n,k,binary);
	for (int i = k-1; i >=0 ; --i)//n=5=1* 2^2 +0* 2^1 +1* 2^0=1+2*(0+2*1)
		//x^5=x^1 * x^(2*(0+2*1))
		//x^(2*(0+2*1))=x^(0+2*1) * x^(0+2*1)
		//x^(0+2*1)=x^0 * x^(2*1)
		//x^(2*1) = x^1 * x^1
	{
		y=y*y;
		if (binary[i]==1)y=x*y;
	}
	return y;
}
//总体而言 : 第一种方法比第二种方法好.

int main(int argc, char const *argv[])
{
	int x=2;
	int n=8;
	cout<<exp(x,n)<<endl;
	cout<<exp(2,3)<<endl;
	cout<<exp(2,4)<<endl;
	cout<<exp(2,5)<<endl;
	cout<<exp(2,6)<<endl;
	cout<<exp(2,7)<<endl;
	cout<<exp(2,8)<<endl;
	system("pause");
	return 0;

}
posted @ 2016-08-31 08:29  jiangge3  阅读(179)  评论(0编辑  收藏  举报