编程作业(2)

因为作业代码涉及隐私,所以文章只提供解题思路和有关拓展,若实在需要源码可以私信

/* 但是这次太简单直接就发发发了唉 */

作业:

用高效算法自制一个高效率的pow函数, 指数只使用正数  (不包括0,适用于极大的整数)

|| 写在前面:

一个误区更正(一直没注意到...):for循环的第一次执行时不单单要执行初始化语句,同时得满足判断条件才能进入循环

|| 算法一:普普通通

若题目要求使用一个变量表示结果x^a,并直接用该值作为返回值

解题思路:将该变量初始化为1.0
优化思路:将该变量直接初始化为底数x
double myPow(double x, int a){
	double res = 1.0;
	for(int i = 0; i < a; i++)
		res *= x;
	
	return res;
}

/*小优化*/
double myPow(double x, int a){
	double res = x;
	for(int i = 0; i < a  - 1; i++)   /*少一次循环*/
		res *= x;

	return res;
}

|| 算法二(用个递归,运行效率不高不过看起来挺好玩)

解题思路:抽象一下程序第一步即显而易见:
 x^10 = x^5  * x^5  / x^11 = x^10 * x  故分两种情况 1,幂乘以幂 2,幂乘以底数自身
//明确函数功能:指定了底数和指数后返回出它的幂 
//定好头尾: 尾: 指数被除为0,返回1; 头: 分两种情况 1,幂乘以幂 2,幂乘以底数自身

double myPow(double x, int n, double &res){
	
	if(n == 0) return 1;
	if(n % 2 == 0)
		return myPow(x, n/2, res) * myPow(x, n/2, res); 
	else
		return x * myPow(x, n-1, res);
}


int main(){
	
	double x = 2;
	int a = 11;
	double temp = 1.0;
	double &tmp = temp;
	double result = myPow(x, a, tmp);  // 放进值为1的(temp)的引用
	printf("%f" , result);
	
	return 0;
}

|| 算法三: 大O:logN ,高效 [夸]

解题思路:x^10 = (x^5) * (x^5); x^5=x^4 * x ; x^4 = x^2 * x^2; ...
double myPow(double x, int n){
	double res = 1.0;
	
	while(n){
		if(n % 2 == 0){
			n = n / 2;
			x *= x;
		}		
		else{
			n--;
			res = res * x;
		}
	}
	return res;
}

你可能感兴趣的:(homework)