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社区

更多推荐