上机练习第48天

第一题

个人总结:An的构造:采用递归方式,从1开始到n,每层根据当前层数i的奇偶决定符号(奇数用+,偶数用-),最后返回时加上右括号,形成嵌套的sin表达式。Sn的构造:先打印n-1个左括号,然后从i=1到n循环,每次先输出当前的Ai表达式,再加上数字n-i+1,并在除最后一次外的每次循环后加右括号,形成多层嵌套的最终表达式。

代码如下:

复制代码
#include <stdio.h>

void printAn(int n, int i) {
    if (i == n) {
        printf("sin(%d)", i);
        return;
    }
    printf("sin(%d%c", i, (i % 2 == 1) ? '+' : '-');
    printAn(n, i + 1);
    printf(")");
}

void printSn(int n) {
    int i;
    for (i = 1; i < n; i++) {
        printf("(");
    }
    for (i = 1; i <= n; i++) {
        printAn(i, 1);
        printf("+%d", n - i + 1);
        if (i < n) {
            printf(")");
        }
    }
}

int main() {
    int N;
    scanf("%d", &N);
    printSn(N);
    printf("\n");
    return 0;
}

第二题

个人总结:每个矩形给定的是任意一对相对顶点,需要先转换为左下角(min_x, min_y)和右上角(max_x, max_y)的形式。求相交矩形:相交矩形的左边界 = 两个矩形左边界最大值;相交矩形的右边界 = 两个矩形右边界最小值;相交矩形的下边界 = 两个矩形下边界最大值; 相交矩形的上边界 = 两个矩形上边界最小值。如果左边界 < 右边界 且 下边界 < 上边界,则两矩形相交,面积为(右边界-左边界) * (上边界-下边界);否则面积为0。最后输出。

代码如下:

复制代码
#include <stdio.h>
double max(double a, double b) {
    return a > b ? a : b;
}
double min(double a, double b) {
    return a < b ? a : b;
}
int main() {
    double x1, y1, x2, y2;  
    double x3, y3, x4, y4; 
    scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
    scanf("%lf %lf %lf %lf", &x3, &y3, &x4, &y4);
    double rect1_x1 = min(x1, x2);
    double rect1_y1 = min(y1, y2);
    double rect1_x2 = max(x1, x2);
    double rect1_y2 = max(y1, y2);
    double rect2_x1 = min(x3, x4);
    double rect2_y1 = min(y3, y4);
    double rect2_x2 = max(x3, x4);
    double rect2_y2 = max(y3, y4);
    double inter_x1 = max(rect1_x1, rect2_x1);
    double inter_y1 = max(rect1_y1, rect2_y1);
    double inter_x2 = min(rect1_x2, rect2_x2);
    double inter_y2 = min(rect1_y2, rect2_y2);
    double area = 0;
    if (inter_x1 < inter_x2 && inter_y1 < inter_y2) {
        area = (inter_x2 - inter_x1) * (inter_y2 - inter_y1);
    }
    printf("%.2f\n", area);
    return 0;
}

第三题

个人总结:特殊情况处理:当M=0时,任何矩阵的0次幂都是单位矩阵(主对角线为1,其余为0);结果矩阵C的第i行第j列元素等于A的第i行与B的第j列对应元素乘积之和。即C[i][j] = sum(A[i][k] * B[k][j])。循环计算:初始化结果矩阵为原矩阵A;进行M-1次乘法运算(因为第1次已经是A^1);每次乘法使用临时矩阵存储中间结果,避免计算过程中数据被覆盖。

代码如下:

复制代码
#include <stdio.h>
int main() {
    int N, M;
    int A[30][30], result[30][30], temp[30][30];
    scanf("%d %d", &N, &M);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            scanf("%d", &A[i][j]);
        }
    }
    if (M == 0) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (i == j) {
                    result[i][j] = 1;
                } else {
                    result[i][j] = 0;
                }
            }
        }
    } else {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                result[i][j] = A[i][j];
            }
        }
        for (int k = 1; k < M; k++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    temp[i][j] = 0;
                    for (int t = 0; t < N; t++) {
                        temp[i][j] += result[i][t] * A[t][j];
                    }
                }
            }
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    result[i][j] = temp[i][j];
                }
            }
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d", result[i][j]);
            if (j < N - 1) {
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}

翻译

但有一个问题依然存在:你如何编写一条指令,让它第一次指向数组的第一个元素,而下一次又指向另一个元素?其实非常简单:你只需借鉴你一直在使用的下标概念。不过,你不再使用下标,而是将下标值放在方括号中。使用这种表示法,你将 number₀ 表示为 number[0]。

按照惯例,number₁ 变为 number[1],number₁₉ 变为 number[19]。这被称为索引。使用典型的引用方式,你现在就可以通过变量来引用数组了。使用数组和循环处理这20个数字的流程图如图3C-4所示。

在接下来的部分,我们将研究一个数组应用:频率数组及其图形表示。

频率数组显示在一系列数字中具有相同值的元素的数量。例如,假设你从0到19之间的100个值中抽取了一个样本。你想知道其中有多少个值是0,多少个是1,多少个是2,依此类推,直到19。

单词打卡

相关推荐
..过云雨2 小时前
【负载均衡oj项目】03. compile_server编译运行服务设计
运维·c++·html·负载均衡
云深麋鹿2 小时前
C++ | 容器vector
开发语言·c++·容器
客卿1232 小时前
二叉树的层序遍历--思路===bfs的应用,以及java中队列的方法实操
java·算法·宽度优先
寻寻觅觅☆2 小时前
东华OJ-进阶题-12-时间转换(C++)
开发语言·c++·算法
cyyt2 小时前
深度学习周报(3.9~3.15)
算法
一直都在5722 小时前
HashMap的扩容和迁移
算法·哈希算法
!停2 小时前
C++入门基础
java·开发语言·c++
承渊政道2 小时前
C++学习之旅【智能指针的使⽤及其原理】
开发语言·c++·笔记·vscode·学习·visual studio
一叶落4382 小时前
LeetCode 380. O(1) 时间插入、删除和获取随机元素【哈希表 + 动态数组 | C语言详解】
c语言·数据结构·c++·算法·leetcode·散列表