日记

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的被除数就是两个数的最大公约数
posted @ 2024-04-13 22:39  pengfu_xin  阅读(1)  评论(0编辑  收藏  举报