我有一项任务要求我使用三种不同的方法计算能力,第二种和第三种方法需要递归。在
T power2(T x, unsigned int n, unsigned int& mults)
我需要计算每次乘法发生时出现的乘法次数(由恶意表示),但由于某种原因,程序不会计算出现的恶意! (注意:我不能在这个项目中使用pow()函数。)
#include <iostream>
using namespace std;
// function prototypes
template <class T>
T power1(T x, unsigned int n, unsigned int& mults);
template <class T>
T power2(T x, unsigned int n, unsigned int& mults);
template <class T>
T power3(T x, unsigned int n, unsigned int& mults);
template <class T>
void printReport(T base, unsigned int pow,
T result1, T result2, T result3,
unsigned int mults1, unsigned int mults2,
unsigned int mults3);
/**
* The usual main function.
*
* It computes the powers 2<sup><em>i</em></sup> for
* <em>i=</em>0,1,2,..,32 via all three methods, reporting the number
* of multiplications needed for each method. (Note what happens for
* 2^32.) It then does likewise for 0.5<sup><em>i</em></sup>, but now
* with <em>i=</em>0,1,2,...64
*
*/
int main()
{
unsigned int mults1, mults2, mults3;
cout << "Test for integer base:\n";
for (unsigned int pow = 0; pow <= 32; pow++) {
unsigned int base = 2;
unsigned int result1 = power1(base, pow, mults1);
unsigned int result2 = power2(base, pow, mults2);
unsigned int result3 = power3(base, pow, mults3);
printReport(base, pow, result1, result2, result3,
mults1, mults2, mults3);
}
cout << "\nTest for floating-point base:\n";
for (unsigned int pow = 0; pow <= 64; pow++) {
double base = 0.5;
double result1 = power1(base, pow, mults1);
double result2 = power2(base, pow, mults2);
double result3 = power3(base, pow, mults3);
printReport(base, pow, result1, result2, result3,
mults1, mults2, mults3);
}
}
/**
* Iterative function to compute a power <em>x<sup>n</sup></em>.
*
* @param x : variable represents the base
* @param n : variable represents power
* @param mults : variable to represent number of calculations
* @return ???
* @pre n >= 0
* @post mults is ???
*/
template <class T>
T power1(T x, unsigned int n, unsigned int& mults)
{
mults = 0;
if (n == 0)
return 1;
else if (n == 1)
return x;
else
{ mults=n-1;
for (int i= 0; i<= n; i++)
{
int result;
result*=x;
return result;
}
}
}
/**
* PROBLEM IS IN THIS FUNCTION BELOW!!!!
*/
template <class T>
T power2(T x, unsigned int n, unsigned int& mults)
{
mults = 0;
if (n == 0) return 1;
else if (n== 1) return x;
else
{
mults = n-1;
return x * power2(x, n-1, mults);
}
}
/*
* Put your comments for power3 here
*/
template <class T>
T power3(T x, unsigned int n, unsigned int& mults)
{
if (n == 0)
{
mults = 0;
return 1;
}
else if (n == 1)
{
mults=0;
return x;
}
else if (n%2 ==0) //if n is even
{
mults++;
return power3(x, n/2, mults)*power3(x, n/2, mults);
}
else
{
return 5;
// seg fault is here
//mults++;
//return x*power3(x,(n-1/2), mults)*power3(x,(n-1/2), mults);
}
}
/**
* Report the results of three different exponentiation calculations.
*
* To give you practice using doxygen, I'll let you fill in the rest
* of this comment block yourself.
*/
template <class T>
void printReport(T base, unsigned int pow,
T result1, T result2, T result3,
unsigned int mults1, unsigned int mults2,
unsigned int mults3)
{
cout << base << "^" << pow << " = ";
if (result1 == result2 && result2 == result3)
cout << result1 << ": ";
else
cout << "(" << result1 << ", " << result2 << ", " << result3
<< ") [ERROR!]: ";
cout << "mults1 = " << mults1 << ", mults2 = " << mults2
<< ", mults3 = " << mults3 << endl;
}