C语言经典题目详解(PTA题目)3

 一.四数立方和问题

#include<stdio.h>

int main(){
    int N;  // 定义变量N,用来存储输入的最大数字
    int a, b, c, d;  // 定义四个变量a, b, c, d,用来遍历所有的组合

    scanf("%d", &N);  // 输入一个整数N

    // 外层循环,a从2到N
    for(a = 2; a <= N; a++) {
        // 第二层循环,b从2到N-1
        for(b = 2; b < N; b++) {
            // 第三层循环,c从b到N-1,确保c >= b,避免重复组合
            for(c = b; c < N; c++) {
                // 第四层循环,d从c到N-1,确保d >= c,避免重复组合
                for(d = c; d < N; d++) {
                    // 如果a^3等于b^3 + c^3 + d^3,打印四个数字
                    if(a * a * a == b * b * b + c * c * c + d * d * d) {
                        // 打印符合条件的a, b, c, d四个数字
                        printf("%d %d %d %d\n", a, b, c, d);
                    }
                }
            }
        }
    }

    return 0;  // 返回0,表示程序结束
}

二.你会计算时间复杂度吗?

 

#include<stdio.h>

int main() {
    // 声明一个字符数组用来存储输入的字符串,最大长度为1000000
    char str[1000000];
    
    // 读取输入的代码字符串,格式是由 "for" 和 "end" 组成
    scanf("%s", str);
    getchar();  // 读取剩余的换行符

    // 用来存储当前循环的深度
    int maxshen = 0;
    
    // 用来计算嵌套的for循环深度
    int count = 0;
    
    // 遍历字符串中的每个字符
    for (int i = 0; str[i] != '\0'; i++) {
        // 检查是否遇到 "for"
        if (str[i] == 'f' && str[i + 1] == 'o' && str[i + 2] == 'r') {
            count++;  // 深度增加
            if (count > maxshen) {  // 更新最大深度
                maxshen = count;
            }
        } 
        // 检查是否遇到 "end"
        else if (str[i] == 'e' && str[i + 1] == 'n' && str[i + 2] == 'd') {
            count--;  // 深度减少
        }
        // 跳过 "for" 和 "end" 的字符,确保在下一次迭代时不会重复计算
        i += 2;
    }

    // 输出根据最大深度计算的时间复杂度
    if (maxshen == 1) {
        printf("O(n)");  // 如果最大深度是1,时间复杂度为 O(n)
    } else {
        printf("O(n^%d)", maxshen);  // 如果最大深度大于1,输出 O(n^depth)
    }

    return 0;
}

 三.判断完全平方数

#include <stdio.h>
#include <math.h>

// 判断是否为完全平方数
int IsSquare(int n) {
    if (n < 0) return 0; // 负数不是完全平方数
    
    int sqrt_n = (int)sqrt(n);  // 计算平方根并强制转换为整数
    if (sqrt_n * sqrt_n == n)  // 判断平方根的平方是否等于原数
        return 1;
    else
        return 0;
}

int main() {
    int n;
    scanf("%d", &n);
    
    if (IsSquare(n))
        printf("YES\n");
    else
        printf("NO\n");
    
    return 0;
}

四.求余弦函数的近似值

#include <stdio.h>

// 计算 cos(x) 的近似值
double funcos(double e, double x) {
    double cosx = 1.0;    // 初始项
    double term = 1.0;    // 当前项的值
    int n = 1;            // 计数器,用于更新分子和分母

    while (1) {
        // 计算当前项
        term *= -(x * x) / (n * (n + 1)); // 递推公式
        n += 2;                           // 阶数加 2
        
        // 累加结果
        cosx += term;

        // 检查绝对值是否小于误差上限
        if (term > -e && term < e) {
            break;
        }

    }

    return cosx;
}

int main() {
    double e, x;
    scanf("%lf %lf", &e, &x);
    printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
    return 0;
}

五. 使用函数输出指定范围内的Fibonacci数

#include <stdio.h>

// 计算第 n 项的 Fibonacci 数
int fib(int n) {
    int arr[100]; // 缓存前 100 项 Fibonacci 数
    arr[0] = 1; 
    arr[1] = 1;
    for (int i = 2; i < 100; i++) {
        arr[i] = arr[i - 1] + arr[i - 2]; // 每一项等于前两项之和
    }
    return arr[n - 1]; // 返回第 n 项
}

// 输出范围 [m, n] 内的所有 Fibonacci 数
void PrintFN(int m, int n) {
    int a = 1, b = 1, c = a + b; // 初始化前三项
    int printed = 0;             // 标志位,记录是否输出了任何 Fibonacci 数

    // 单独处理 m = 1 的情况
    if (m <= 1 && n >= 1) {
        printf("1 1"); // 前两项均为 1
        printed = 1;   // 设置标志位
    }

    // 遍历后续 Fibonacci 数
    while (c <= n) {
        if (c >= m) { // 如果当前项在范围内
            if (printed) {    // 如果之前已经打印了数字,打印空格分隔
                printf(" ");
            }
            printf("%d", c);  // 打印当前项
            printed = 1;      // 设置标志位
        }
        a = b;      // 更新 a 为 b
        b = c;      // 更新 b 为当前项
        c = a + b;  // 计算下一项
    }

    if (!printed) { // 如果没有输出任何数字,打印提示
        printf("No Fibonacci number");
    }
    printf("\n");   // 输出换行
}

// 测试程序
int main() {
    int m, n, t;

    // 输入范围 [m, n] 和第 t 项
    scanf("%d %d %d", &m, &n, &t);
    printf("fib(%d) = %d\n", t, fib(t)); // 输出第 t 项的 Fibonacci 数
    PrintFN(m, n); // 输出范围内的所有 Fibonacci 数

    return 0;
}

六.数组循环右移

 

#include <stdio.h>
#define MAXN 10

void ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;
    
    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
    
    ArrayShift(a, n, m);
    
    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");
    
    return 0;
}

/* 你的代码将被嵌在这里 */
void ArrayShift( int a[], int n, int m ){
    int newa[n];  // 创建一个临时数组来存储重新排列后的元素
    m = m % n;    // 对 m 取模,避免移动超过数组长度

    // 遍历数组,将元素重新安排到新位置
    for(int i = 0; i < n; i++){
        if(n - 1 - i >= m){  // 如果当前元素的右侧剩余空间大于等于 m
            newa[i + m] = a[i];  // 将当前元素移动到右侧 m 个位置
        } else {  // 当前元素不能完全移动到右侧
            newa[m - n + i] = a[i];  // 将其循环移动到左侧剩余的位置
        }
    }

    // 将临时数组的内容拷贝回原数组
    for(int i = 0; i < n; i++){
        a[i] = newa[i];
    }
}

七.使用函数实现字符串部分复制

void strmcpy( char *t, int m, char *s ){
    int count = 0;  // 初始化计数器,用来跟踪拷贝的字符数
    // 从 t[m-1] 开始遍历直到 t 中的字符 '\0' 结束
    for(int i = m - 1; t[i] != '\0'; i++){
        s[count++] = t[i];  // 将 t 中从 m-1 索引开始的字符逐个拷贝到 s 中
    }
    s[count] = '\0';  // 在 s 的末尾加上 null 字符 '\0',表示字符串结束
}

八.删除字符

#include <stdio.h>
#define MAXN 20

void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char str[MAXN], c;

    scanf("%c\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", str);
    
    return 0;
}

/* 你的代码将被嵌在这里 */
void delchar( char *str, char c ) {
    // 遍历整个字符串
    for(int i = 0; str[i] != '\0'; i++) {
        // 如果当前字符是待删除的字符
        if(str[i] == c) {
            // 从当前位置 i 开始,将后续字符往前移动一位
            for(int j = i; str[j] != '\0'; j++) {
                // 将 str[j+1] 的字符覆盖到 str[j]
                str[j] = str[j + 1];
            }
            // 由于字符被删除,i 需要回退一位,继续检查当前位置的新字符
            i--;
        }
    }
}

九.找最小的字符串

#include <stdio.h>
#include <string.h>

int main() {
    int num; // 用于存储输入的字符串数量
    char minStr[80]; // 用于存储当前最小的字符串

    // 读取字符串数量
    scanf("%d", &num);

    // 读取第一个字符串,作为初始最小字符串
    scanf("%s", minStr);

    // 遍历剩余的字符串,逐一比较
    for (int i = 0; i < num; i++) {
        char str[80]; // 临时存储每次读取的字符串
        scanf("%s", str); // 读取当前字符串

        // 如果当前字符串小于 minStr(按字典序比较)
        if (strcmp(minStr, str) > 0) {
            strcpy(minStr, str); // 更新 minStr 为当前字符串
        }
    }

    // 输出最小的字符串
    printf("Min is: %s", minStr);
    return 0;
}

十.字符串排序

#include<stdio.h>
#include<string.h>

int main() {
    char str[5][80];  // 用于存储5个字符串的二维数组,每个字符串最长为79个字符
    char temp[80];    // 用于在排序过程中临时交换字符串的变量

    // 读取5个字符串输入
    for (int i = 0; i < 5; i++) {
        scanf("%s", str[i]); // 按顺序读取每个字符串
    }

    // 排序字符串(按字典序升序)
    for (int i = 0; i < 5; i++) {              // 遍历数组中的每个字符串
        for (int j = i + 1; j < 5; j++) {      // 比较当前字符串和之后的字符串
            if (strcmp(str[i], str[j]) > 0) {  // 如果 str[i] > str[j],则交换它们
                strcpy(temp, str[j]);          // 将 str[j] 存到 temp
                strcpy(str[j], str[i]);        // 将 str[i] 存到 str[j]
                strcpy(str[i], temp);          // 将 temp 存到 str[i]
            }
        }
    }

    // 输出排序后的字符串
    printf("After sorted:\n");
    for (int i = 0; i < 5; i++) {
        printf("%s\n", str[i]);  // 按行输出排序后的字符串
    }

    return 0;
}

资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在Android移动应用开发中,定位功能扮演着极为关键的角色,尤其是在提供导航、本地搜索等服务时,它能够帮助应用获取用户的位置信息。以“baiduGPS.rar”为例,这是一个基于百度地图API实现定位功能的示例项目,旨在展示如何在Android应用中集成百度地图的GPS定位服务。以下是对该技术的详细阐述。 百度地图API简介 百度地图API是由百度提供的一系列开放接口,开发者可以利用这些接口将百度地图的功能集成到自己的应用中,涵盖地图展示、定位、路径规划等多个方面。借助它,开发者能够开发出满足不同业务需求的定制化地图应用。 Android定位方式 Android系统支持多种定位方式,包括GPS(全球定位系统)和网络定位(通过Wi-Fi及移动网络)。开发者可以根据应用的具体需求选择合适的定位方法。在本示例中,主要采用GPS实现高精度定位。 权限声明 在Android应用中使用定位功能前,必须在Manifest.xml文件中声明相关权限。例如,添加<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,以获取用户的精确位置信息。 百度地图SDK初始化 集成百度地图API时,需要在应用启动时初始化地图SDK。通常在Application类或Activity的onCreate()方法中调用BMapManager.init(),并设置回调监听器以处理初始化结果。 MapView的创建 在布局文件中添加MapView组件,它是地图显示的基础。通过设置其属性(如mapType、zoomLevel等),可以控制地图的显示效果。 定位服务的管理 使用百度地图API的LocationClient类来管理定位服务
资源下载链接为: https://pan.quark.cn/s/dab15056c6a5 Oracle Instant Client是一款轻量级的Oracle数据库连接工具,能够在不安装完整Oracle客户端软件的情况下,为用户提供访问Oracle数据库的能力。以“instantclient-basic-nt-12.1.0.1.0.zip”为例,它是针对Windows(NT)平台的Instant Client基本版本,版本号为12.1.0.1.0,包含连接Oracle数据库所需的基本组件。 Oracle Instant Client主要面向开发人员和系统管理员,适用于数据库查询、应用程序调试、数据迁移等工作。它支持运行SQL*Plus、PL/SQL Developer等管理工具,还能作为ODBC和JDBC驱动的基础,让非Oracle应用连接到Oracle数据库。 安装并解压“instantclient_12_1”后,为了使PL/SQL Developer等应用程序能够使用该客户端,需要进行环境变量配置。设置ORACLE_HOME指向Instant Client的安装目录,如“C:\instantclient_12_1”。添加TNS_ADMIN环境变量,用于存放网络配置文件(如tnsnames.ora)。将Instant Client的bin目录添加到PATH环境变量中,以便系统能够找到oci.dll等关键动态链接库。 oci.dll是OCI(Oracle Call Interface)库的重要组成部分。OCI是Oracle提供的C语言接口,允许开发者直接与数据库交互,执行SQL语句、处理结果集和管理事务等功能。确保系统能够找到oci.dll是连接数据库的关键。 tnsnames.ora是Oracle的网络配置文件,用于定义数据库服务名与网络连接参数的映射关系,包括服务器地址
## 1. 概述 `SpineManager` 是用于管理 Spine 动画实例的核心单例类,主要负责 Spine 动画的对象池管理、分组轮转更新、LOD(细节层次)控制,确保性能与资源使用最优化。 `SpineManagerExtend` 作为其业务逻辑扩展,封装常用的实例生成和回收方法,避免主管理类与游戏业务逻辑耦合。 `SpineManagerLODConfig` 是通过 ScriptableObject 配置的参数文件,方便设计师在编辑器中调节 Spine 动画的 LOD 距离阈值、更新频率和分区数量。 --- ## 2. SpineManager 核心功能 ### 2.1 单例设计 - 真单例实现,避免静态构造顺序带来的隐患。 - 全局唯一 Spine 管理实例,支持任意时机调用。 ### 2.2 对象池管理 - 每个 `SkeletonDataAsset` 资源路径对应一个 Spine 实例对象池。 - 实例租赁时优先复用,避免频繁销毁创建。 - 实例回收后自动隐藏并挂入管理隐藏节点,停止更新。 ### 2.3 分组轮转更新机制 - 所有激活 Spine 实例被划分为 `groupCount` 个分区。 - 每帧仅更新当前轮转分区,分散性能压力。 - 支持动态注册与注销 Spine 代理。 ### 2.4 LOD 细节层次控制 - 自动计算摄像机与实例距离,选择适当更新频率: - 高精度(近距离):高频更新。 - 中精度(中距离):中频更新。 - 低精度(远距离):低频更新。 - 更新频率及距离阈值由 `SpineManagerLODConfig` 决定。 ### 2.5 注册与注销机制 - 实例激活时自动加入负载最少的分区。 - 回收时从对应分区中移除并归还对象池。 ### 2.6 每帧更新流程 - `SpineM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值