2024.4.13
#include<stdio.h>
void f(int num,int *num_1){
int a,b,c,d;
int num_3;
for(int i=0;i<num;i++){
scanf("%d",&num_3);
a=num_3/1000%10;
b=num_3/100%10;
c=num_3/10%10;
d=num_3%10;
if(d-a-b-c>0) (*num_1)++;
}
// printf("%d",*num_1);
}
int main(){
int num=0,num_1=0;
scanf("%d",&num);
f(num,&num_1);
printf("%d",num_1);
return 0;
}
这题之前错过一次,错误的原因是没有对num_1正确地使用指针。在C语言中,只要不涉及量的变化,就不用涉及指针,所以题中的num就不用使用指针,而num_1在题中的量发生了变化,因此他的原先存储的位置也发生了变化,所以输出时还是输出指针最初指向的那个位置的值,也就是0;而如果将其从主函数引入函数中时使用了指针,那么随着num_1的改变,其位置也会跟着改变,其能完成的输出也会跟着指针所指位置的改变而改变——最终完成函数中的对num_1的最终的量的输出。(重点:指针随着变量的值变化而变化位置,位置始终和变量的值一一对应)
另外,我发现斐波拉契数列的正确求法:
#include<stdio.h>
void f(int num,double *sum){
double a=1,b=1,c=0;
for(int i=0;i<num;i++){
c=a+b;
a=b;
b=c;
(*sum)+=b/a;
}
}
int main(){
int num=0;
double sum=0;
scanf("%d",&num);
f(num,&sum);
printf("%.4lf",sum);
return 0;
}
通过另设置一个变量c,形成一种鱼咬尾的态势
另外,记住,辗转相除法就是通过两个数不断地相除不断地取余,然后用旧的余数不断地除那个新的余数,最后那个结果为0的被除数就是两个数的最大公约数