首页 > 其他分享 >C语言每日一题——第八天

C语言每日一题——第八天

时间:2022-10-05 12:23:38浏览次数:46  
标签:缓存 return calculate 第八天 int 每日 long C语言 数组

第八天

小明学习到了数组,同时,在最近的开发中,他发现很多递归运算存在重复计算相同数值的问题。他决定利用数组缓存运算的结果。

有一个数组\(a_{n}\),已知\(a_n = a_{n-2} - a_{n-1} + 2\),且有\(a_1 = 1\), \(a_2 = 0\)。请编写带有缓存的函数,通过递推式计算\(a_n\)的值。你不必要检查输入,但为避免结果溢出,请使用long long类型。

输入

程序通过scanf获取希望求得的项数。

输出

项数n对应的数列值。

关键

数组初始化,数组运用,静态数组,函数递归


解答

#include <stdio.h>


#define CACHE_LENGTH 64


long long calculate_a(int);


int main() {
    int n;
    printf(">>> ");
    scanf("%d", &n);

    printf("%lld\n", calculate_a(n));

    return 0;
}

long long calculate_a(int n) {
    static long long cache[CACHE_LENGTH] = {0};  // 使用静态数组作为缓存,并将其初始化为全0数组
    if (n == 1) {
        return 1;
    } else if (n == 2) {
        return 0;
    }

    if (n - 3 < CACHE_LENGTH) {  // 由于前两个值不需缓存,缓存的下标0对应n=3
        // n 在缓存范围内
        if (cache[n - 3] == 0) {
            // 还未计算过,无缓存
            cache[n - 3] = calculate_a(n - 2) - calculate_a(n - 1) + 2;
        }
        return cache[n - 3];
    } else {
        // n过大,不在缓存范围内
        return calculate_a(n - 2) - calculate_a(n - 1) + 2;
    }
}

标签:缓存,return,calculate,第八天,int,每日,long,C语言,数组
From: https://www.cnblogs.com/tobe-goodlearner/p/basic_C_programming-day_8.html

相关文章

  • 【C语言】循环语句
    ......
  • C语言:沙漏图形
    #include<stdio.h>#include<math.h>main(){inta,b,c,d;for(a=-9;a<=9;a++){for(b=1;b<=19-abs(a);b++)printf("");for......
  • 【C语言_14】快速学会使用字符数组
    1.初始化字符数组#include<stdio.h>intmain(){charstr[20]="helloworld";//charstr[20]={'h','e','l','l','o','w','o','r','l','d'};printf("......
  • C语言学习记录2
    先来晒一晒日落~将三个数值从小到大排列:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){intx,y,z,t=0;scanf("%d%d%d",&x,&y,&z);if(x>......
  • C语言变量命名规则
    在定义变量时,变量名可以是字母、数字和下划线的组合。但是也不是随便的组合,要注意以下几个命名规则:1、变量名以英文字母开头;变量名的开头不能是数字,可以由字母或下划线开......
  • C语言读写文件
    1.从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个'#'#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;charch,filename[10];......
  • C语言标识符
    定义:在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。理解:可以简单认为是一个名字,用来标识常量名、变量名、函数及数组等‘......
  • 初学C语言笔记221004动态内存管理
    constint*consta=&b;//3intconst*consta=&b;//4第三个a是静态的指针(第二个const修饰),指向int,这个int是静态的(第一个const修饰)第四个a是静态的......
  • 快速排序-C语言实现
    快速排序排序思想1.选定Pivot中心轴2.将大于Pivot的数字放在Pivot的右边3.将小于Pivot的数字放在Pivot的左边4.分别对左右子序列(此时有左右2个子表),重复前三步操......
  • 每日一结
    剑指Offer33.二叉搜索树的后序遍历序列(递归)因为后序遍历最后一个位置是根节点,又因为二叉平衡树左子树一定小于根节点,右子树一定大于根节点。而左子树也是如此,右子树......