我使用简单的for循环为复数(自制类)写了一个天真的(只接受整数指数)幂函数,它将原始数字的结果乘以n次:
C pow(C c, int e) {
C res = 1;
for (int i = 0; i==abs(e); ++i) res=res*c;
return e > 0 ? res : static_cast<C>(1/res);
}
当我尝试执行此操作时,例如
C c(1,2);
cout << pow(c,3) << endl;
我总是得到1,因为for循环没有执行(我检查过)。 这是完整的代码:
#include <cmath>
#include <stdexcept>
#include <iostream>
using namespace std;
struct C {
// a + bi in C forall a, b in R
double a;
double b;
C() = default;
C(double f, double i=0): a(f), b(i) {}
C operator+(C c) {return C(a+c.a,b+c.b);}
C operator-(C c) {return C(a-c.a,b-c.b);}
C operator*(C c) {return C(a*c.a-b*c.b,a*c.b+c.a*b);}
C operator/(C c) {return C((a*c.a+b*c.b)/(pow(c.a,2)+pow(c.b,2)),(b*c.a - a*c.b)/(pow(c.a,2)+pow(c.b,2)));}
operator double(){ if(b == 0)
return double(a);
else
throw invalid_argument(
"can't convert a complex number with an imaginary part to a double");}
};
C pow(C c, int e) {
C res = 1;
for (int i = 0; i==abs(e); ++i) {
res=res*c;
// check wether the loop executes
cout << res << endl;}
return e > 0 ? res : static_cast<C>(1/res);
}
ostream &operator<<(ostream &o, C c) { return c.b ? cout << c.a << " + " << c.b << "i " : cout << c.a;}
int main() {
C c(1,2), d(-1,3), a;
cout << c << "^3 = " << pow(c,3) << endl;}
答案 0 :(得分:1)
您所写的内容如下:
for (int i = 0; i == abs(e); ++i)
用0和初始化i,而 i等于e的绝对值(即在函数调用开始时为3),做一些事情
应该是
for (int i = 0; i < abs(e); ++i)
提示:由于双转换运算符(由a*c.b + c.a*b
引起),代码将在第一次迭代时抛出,但这是另一个问题:修复复杂(即虚构部分)打印功能或实现漂亮的印刷方法等。
答案 1 :(得分:0)
你应该使用i!= abs(e)或i&lt; abs(e)关于循环条件。目前你正在使用i == abs(e),它会在第一次尝试时失败,因为:
i = 0 abs(e)= 3
所以0 == 3是假的,因此for循环不会执行。