写了一个类型转换函数和构造转换函数
但是没有写加法重载
为什么这样还能实现复数相加啊?
最后判断类型也是复数
因为有operator double()函数,会自动转换为double类型相加,但最终结果并不是你想要的,会丢失虚部值
因为你重载了double强制类型转换符。所以说从编译的角度没有问题
但是建议你重载下+运算,把实部虚部都相加,返回一个complex对象
斐波那契数列是指这样一个数列:
1 1 2 3 5 8 13 21 34 55 ~ ~ ~等这样的一组数列。
它的规律是第三个数等于前两个数之和
#include<stdio.h>
#include<stdlib.h>
int Fibonacci_1(size_t n)//注意返回值可能会很大,但c语言中最大整数为4294967295
{ //测试后只能计算前46个斐波那契额数列
int first,second,third;//非递归算法
int i;
first=0;
second=1;
if(n<=2)
{
return 1;
}
for(i=2; i<=n; i++)
{
third=first+second;
first=second;
second=third;
}
return third;
}
int Fibonacci_2(size_t n)//递归算法
{
if(n<=2)
{
return 1;
}
else
return Fibonacci_1(n-1)+Fibonacci_1(n-2);
}
int main()
{
size_t n=40;
printf("非递归算法第%d个斐波那契数为>:%d\n",n,Fibonacci_1(n));
printf("递归算法第%d个斐波那契数为>:%d\n",n,Fibonacci_2(n));
system("pause");
return 0;
}
运行结果如下:
两个代码看起来相差不了多少,但从时间复杂度和空间复杂度上比较,还是相差很远的。
时间复杂度:
递归算法:
非递归: 通过观察循环次数就可以发现,非递归只需要循环 n次就可以计算出第n个斐波那契数,所以它的时间复杂度时O(n);
这时当假如n为100时,递归算法需要计算2^100次,二非递归只需要计算100次,这时候递归算法可能需要很长一段时间,而非递归却很快,这就通过时间复杂度体现了两者算法的差别。
空间复杂度 :
而非递归方法开辟了三个变量空间,空间复杂度为O(1),而递归的是O(n);但现在随着硬件的发展,空间复杂度已经不那么重要了。
所以总体来说非递归的算法效率更高。