OJ26

个人总结:1. sum初始值改为1,阶乘的乘法初始值必须是1
2. 每次乘法后立即去掉末尾的0,避免数值过大
3. 只保留最后几位有效数

#include<stdio.h>

int main(){
    int n;
    scanf("%d", &n);
    long long result = 1;  // 用long long减少溢出风险
    
    for(int i = 1; i <= n; i++){
        result *= i;
        while(result % 10 == 0){
            result /= 10;
        }
        result = result % 10000;
    }
    

    printf("%d\n", result % 10);
    return 0;
}

字(比如最后4位),进一步防止溢出


OJ27

个人总结:1. 结构体定义:字符数组存菜名,末尾加分号
 2. 四舍五入到角(保留1位小数) 方法:先×10,四舍五入取整,再÷10

#include<stdio.h>
struct Dish {
    char kind[20];  // 菜名是字符串,用字符数组存储
    double num;     // 数量
    double price;   // 单价
};  // 结构体末尾必须加分号

int main() {
    int group_num;
    scanf("%d", &group_num);
    for (int i = 0; i < group_num; i++) {
        int dish_num;
        scanf("%d", &dish_num);
        
        double total = 0.0; 
        struct Dish dish;    
        for (int j = 0; j < dish_num; j++) {
            scanf("%s %lf %lf", dish.kind, &dish.num, &dish.price);
            total += dish.num * dish.price;
        }
        
       
        total = (double)((int)(total * 10 + 0.5)) / 10;
        printf("%.1f\n", total);
    }
    
    return 0;
}

OJ28

个人总结:本题输出格式较为复杂
 

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

int main() {
    // 定义水果的代码、名称、单价对应关系
    struct Fruit {
        char code;       // 水果代码
        char name[20];   // 水果名称
        double price;    // 单价(元/公斤)
    } fruits[] = {
        {'a', "apple", 1.5},
        {'o', "orange", 1.4},
        {'b', "banana", 1.48},
        {'p', "pineapple", 1.08}
    };
    int fruit_count = sizeof(fruits) / sizeof(fruits[0]); // 水果种类数

    int m; // 每组的货品数量
    int group_index = 0; // 记录当前是第几组数据,用于处理空行

    // 循环读取每组数据(直到输入结束)
    while (scanf("%d", &m) == 1) {
        // 不是第一组的话,先输出一个空行(满足组间空行要求)
        if (group_index > 0) {
            printf("\n");
        }
        group_index++;

        double total_sum = 0.0; // 本组所有货品的总价总和
        char name_line[100] = ""; // 存储第一行(水果名)的内容
        char price_line[100] = ""; // 存储第二行(价格)的内容
        char weight_line[100] = ""; // 存储第三行(重量)的内容

        // 初始化第一行开头的7个空格
        strcat(name_line, "       ");
        // 初始化第二行的price和空格
        strcat(price_line, "price  ");
        // 初始化第三行的weight和空格
        strcat(weight_line, "weight ");

        // 处理本组的m个货品
        for (int i = 0; i < m; i++) {
            char d;
            double g;
            scanf(" %c %lf", &d, &g); // 读取货品代码和重量(%c前加空格跳过换行/空格)

            // 匹配对应的水果信息
            char fruit_name[20] = "";
            double unit_price = 0.0;
            for (int j = 0; j < fruit_count; j++) {
                if (fruits[j].code == d) {
                    strcpy(fruit_name, fruits[j].name);
                    unit_price = fruits[j].price;
                    break;
                }
            }

            // 计算单个货品的总价
            double single_sum = unit_price * g;
            total_sum += single_sum;

            // 拼接第一行(水果名):apple后加2个空格,其他加1个空格
            strcat(name_line, fruit_name);
            if (strcmp(fruit_name, "apple") == 0) {
                strcat(name_line, "  ");
            } else {
                strcat(name_line, " ");
            }

            // 拼接第二行(价格):按格式输出单价(注意pineapple占10格,其他7格,左对齐,2位小数)
            char price_str[20];
            if (strcmp(fruit_name, "pineapple") == 0) {
                sprintf(price_str, "%-10.2f", unit_price);
            } else {
                sprintf(price_str, "%-7.2f", unit_price);
            }
            strcat(price_line, price_str);

            // 拼接第三行(重量):格式和价格行一致
            char weight_str[20];
            if (strcmp(fruit_name, "pineapple") == 0) {
                sprintf(weight_str, "%-10.2f", g);
            } else {
                sprintf(weight_str, "%-7.2f", g);
            }
            strcat(weight_line, weight_str);
        }

        // 在第一行末尾添加sum
        strcat(name_line, "sum");
        // 在第二行末尾添加总总价(占7格,2位小数,左对齐,后加2个空格)
        char total_str[20];
        sprintf(total_str, "%-7.2f  ", total_sum);
        strcat(price_line, total_str);
        // 第三行无sum对应的重量,无需额外处理

        // 输出三行内容
        printf("%s\n", name_line);
        printf("%s\n", price_line);
        printf("%s\n", weight_line);
    }

    return 0;
}

OJ29

个人总结:本题较简单只需将键盘输入的奇数求乘积
 

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

int main() {
    int n;
    int sum=1;
    scanf("%d",&n);
    int  num;
    for(int i=0;i<n;i++){
        scanf("%d",&num);
    if(num%2!=0){
     sum*=num;
    }
    }
printf("%d",sum);
    return 0;
}

OJ30

个人总结本题需要首先要比较年份其次比较月份最后比较日期
 

#include <stdio.h>

int main() {
    int N;
    // 循环读取每组测试数据(直到输入结束)
    while (scanf("%d", &N) == 1) {
        // 初始化最早/最晚日期的变量(用第一个日期初始化)
        int min_year, min_month, min_day;
        int max_year, max_month, max_day;
        
        // 读取第一个日期,作为初始的最早和最晚日期
        scanf("%d %d %d", &min_year, &min_month, &min_day);
        max_year = min_year;
        max_month = min_month;
        max_day = min_day;
        
        // 处理剩余N-1个日期
        for (int i = 1; i < N; i++) {
            int y, m, d;
            scanf("%d %d %d", &y, &m, &d);
            
            // 比较当前日期是否比最晚日期更晚
            if (y > max_year) {
                max_year = y;
                max_month = m;
                max_day = d;
            } else if (y == max_year) {
                if (m > max_month) {
                    max_month = m;
                    max_day = d;
                } else if (m == max_month && d > max_day) {
                    max_day = d;
                }
            }
            
            // 比较当前日期是否比最早日期更早
            if (y < min_year) {
                min_year = y;
                min_month = m;
                min_day = d;
            } else if (y == min_year) {
                if (m < min_month) {
                    min_month = m;
                    min_day = d;
                } else if (m == min_month && d < min_day) {
                    min_day = d;
                }
            }
        }
        
        // 输出结果:第一行最晚日期,第二行最早日期
        printf("%d %d %d\n", max_year, max_month, max_day);
        printf("%d %d %d\n", min_year, min_month, min_day);
    }
    return 0;
}

它们的环境,以及执行器(actuators)—— 通过这些装置,智能体可以对环境产生影响。传感器的例子包括麦克风、摄像头、测距传感器(range sensors)以及空气或土壤采样设备。执行器的例子包括轮子、腿、翅膀、夹持器(grippers)和语音合成器(speech synthesizers)。

人工智能领域的大部分研究,都可以放在构建智能体(agents)的背景下进行描述 —— 这些智能体能够表现出智能行为,也就是说,其执行器的动作必须是对传感器所接收数据的理性响应。反过来,我们可以通过考虑这些响应的不同层次,来对这类研究进行分类。

最简单的响应是反射动作(reflex action),即对输入数据做出的预设反应。要获得更 “智能” 的行为,就需要更高层次的响应。例如,我们可以让智能体掌握其所处环境的知识,并要求它据此调整自身行为。投掷棒球的过程很大程度上是一种反射动作,但决定如何以及向哪里投球,则需要对当前环境有所了解。如何存储、更新、访问并最终在决策过程中应用这类现实世界知识,至今仍是人工智能领域的一大难题。

如果我们希望智能体去追求某个目标,比如赢得一盘棋或在拥挤的通道(passageway)中灵活移动(maneuvering),就需要另一层次的响应。这种目标导向的行为要求智能体的响应(或一系列响应),是刻意制定行动计划或从当前选项中选择最佳行动的结果。

在某些情况下,智能体的响应会随着学习过程而不断改进。这可能表现为发展程序性知识(procedural knowledge,即学习 “如何做”),或存储陈述性知识(declarative knowledge,即学习 “是什么”)。学习程序性知识通常涉及一个试错(trial-and-error)过程:智能体通过因不当行为受到惩罚、因恰当行为得到奖励,来学习合适的行动。

 

英文术语 中文翻译 说明
sensor 传感器 用于感知环境信息的装置,如麦克风、摄像头
actuator 执行器 用于对环境产生影响的装置,如轮子、夹持器
range sensor 测距传感器 测量距离的传感器
gripper 夹持器 用于抓取物体的机械装置
speech synthesizer 语音合成器 将文本转换为语音的设备
agent 智能体 能够感知环境并采取行动的实体
rational response 理性响应 基于感知数据做出的合理行为
reflex action 反射动作 对输入数据的预设、自动响应
procedural knowledge 程序性知识 关于 “如何做” 的知识,如技能、步骤
declarative knowledge 陈述性知识 关于 “是什么” 的知识,如事实、概念
trial-and-error 试错 通过反复尝试和修正来学习的过程
goal-directed behavior 目标导向行为 为达成特定目标而采取的有计划行动
maneuvering 灵活移动 在复杂环境中调整位置或方向
passageway 通道 供人或物体通过的空间

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐