函数调用时:swap(*pt1,*pt2) ; 实参多了 '*'号,应为:swap(pt1, pt2);
如果对你有启发和帮助,请采纳! 答案参考Chatgpt解答
根据你提供的代码和错误信息来看,存在几个问题:
错误信息中提到无法将参数1从'int'转换为'int *',这是因为在函数调用swap(*pt1, *pt2)
时,swap
函数的参数类型应该是指针类型,而不是整数类型。
函数swap
的声明应该放在main
函数之前,或者提前进行函数原型声明。
下面是修改后的代码示例:
#include <stdio.h>
void swap(int *p1, int *p2); // 函数原型声明
int main() {
int a, b, *pt1, *pt2;
scanf("%d%d", &a, &b);
pt1 = &a;
pt2 = &b;
if (a < b)
swap(pt1, pt2);
printf("max=%d, min=%d\n", *pt1, *pt2);
return 0;
}
void swap(int *p1, int *p2) {
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
在修改后的代码中,我们将swap
函数的原型声明放在main
函数之前,这样编译器就可以正确识别函数的参数类型。此外,还将swap(*pt1, *pt2)
改为swap(pt1, pt2)
,以传递指针变量的地址。
请注意,上述代码是基于C语言进行修改的,因此文件扩展名应该为.c
而不是.cpp
。
希望这个解答能够帮助你修复代码中的错误。如果你有任何进一步的问题,请随时提问。
斐波那契数列是指这样一个数列:
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);但现在随着硬件的发展,空间复杂度已经不那么重要了。
所以总体来说非递归的算法效率更高。
问题解答:
题目要求按从大到小的顺序输出两个整数,可以使用函数和指针实现。具体步骤如下:
void sort(int *a, int *b){
if(*a < *b){
int temp = *a;
*a = *b;
*b = temp;
}
}
int main(){
int a = 50, b = 30;
sort(&a, &b);
printf("%d %d", a, b);
return 0;
}
完整代码如下:
#include<stdio.h>
void sort(int *a, int *b){
if(*a < *b){
int temp = *a;
*a = *b;
*b = temp;
}
}
int main(){
int a = 50, b = 30;
sort(&a, &b);
printf("%d %d", a, b);
return 0;
}
运行结果为:50 30,符合题目要求。
关于强制类型转换的问题,可能是因为在将整型转换为指针类型时,指针类型可能不是整型的,需要进行强制类型转换。比如将int类型转换为char类型的指针,可以使用以下代码进行转换:
int a = 65; //a为整型变量
char *ptr = (char *)&a;//ptr为char类型指针,需要进行强制类型转换
但在上面的题目中,并没有进行强制类型转换,应该不会出现这个问题。