牛客:Rise of Shadows(数学判断),转“人工“(字符加逻辑转换),马弓手关羽请战华雄(加法运算)

Rise of Shadows(数学判断)

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码(逐步判断)

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

// 判断一个数是否为质数
int isPrime(int year) {
    if (year <= 1) return 0;
    for (int i = 2; i <= sqrt(year); i++) {
        if (year % i == 0) return 0;
    }
    return 1;
}

// 判断一个数是否为闰年
int isLeapYear(int year) {
    if ((year % 4 == 0 && year % 100!= 0) || (year % 400 == 0)) {
        return 1;
    }
    return 0;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int year;
        scanf("%d", &year);
        if (isLeapYear(year) && isPrime(year)) {
            printf("yes\n");
        } else {
            printf("no\n");
        }
    }
    return 0;
}

代码思路

这段代码的目的是判断给定的年份是否为质数闰年。质数闰年需要同时满足两个条件:是闰年并且年份数字是质数。程序通过读取多个测试用例(年份),对每个年份进行判断,并输出相应的结果(yes表示是质数闰年,no表示不是)。

  • isPrime函数:判断一个整数是否为质数。
    • 思路:首先,如果输入的数year小于等于 1,根据质数的定义,它不是质数,直接返回false(在 C 语言版本中返回 0)。然后,从 2 开始到year的平方根(包含平方根)依次检查能否整除year。如果能整除,说明year不是质数,返回false(在 C 语言版本中返回 0);如果循环结束都没有找到能整除的数,则year是质数,返回true(在 C 语言版本中返回 1)。
  • isLeapYear函数:判断一个整数是否为闰年。
    • 思路:根据闰年的定义,如果年份能被 4 整除但不能被 100 整除,或者能被 400 整除,那么这个年份就是闰年,返回true(在 C 语言版本中返回 1);否则返回false(在 C 语言版本中返回 0)。
  1. 首先读取测试用例的数量T
  2. 进入while循环,循环T次,每次处理一个年份的判断。
    • 在循环内部,读取一个年份year
    • 调用isLeapYearisPrime函数判断year是否为质数闰年。
    • 如果是,输出yes;如果不是,输出no

运行代码(直接推断)

根据质数和闰年的定义,可知道质数闰年不存在

#include <stdio.h>

// 解决单个测试用例的函数
void solve() {
    long long n;
    scanf("%lld", &n);
    printf("no\n");
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        solve();
    }
    return 0;
}

转"人工"(字符加逻辑转换)

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <stdio.h>
#include <string.h>
int main() {
    char str[100000];
    scanf("%s", str);
    int len = strlen(str);
    if (str[len - 1] == 'E')
        printf("E模式");
    else
        printf("I模式");
    return 0;
}

代码思路

这段代码的目的是根据给定的仅包含'E''I'的字符串指令,确定执行完这些指令后机器处于哪种模式(E模式或I模式)。

  • 输入指令字符串:使用scanf("%s", str);读取一个字符串到字符数组str中,这个字符串代表机器指令序列。
  • 确定字符串长度:通过int len = strlen(str);计算输入字符串的长度,以便后续处理。
  • 判断最后一个字符确定模式:根据题目中的规则,如果最后一个指令字符是'E',那么就输出 “E 模式”;如果最后一个指令字符是'I',那么就输出 “I 模式”。这是因为整个指令序列执行完后,机器的状态取决于最后执行的那个指令,而题目中明确规定了每个指令对模式的影响,例如在E模式下读取E仍为E模式,在I模式下读取I仍为I模式等,所以只需要关注最后一个指令字符即可确定最终模式。

马弓手关羽请战华雄(加法运算)

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <stdio.h>
int main() {
    int n;
    scanf("%d", &n);
    int r = 1;
    for (int i = 1; i <= n; ++i) {
        int x;
        scanf("%d", &x);
        if (i <= r) {
            r = r> i + x? r : i + x;
        }
    }
    if (r >= n) {
        printf("YES");
    } else {
        printf("NO");
    }
    return 0;
}

代码思路

这段代码的目的是判断从第一个区块出发,能否到达编号为n的区块。每个区块上的数字表示从该区块可以向前走的最大步数。

  • 输入区块数量 n:使用scanf("%d", &n);读取一个整数n,代表面前的区块数量。
  • 初始化变量:设置变量r初始值为 1,表示当前能到达的最远区块编号。初始时,从第一个区块出发,所以能到达的最远位置就是第一个区块本身,即编号为 1 的区块。
  • 遍历每个区块:使用for循环从第二个区块开始遍历每个区块(i从 1 到n)。在每次循环中,读取当前区块上的数字x,代表从该区块可以向前走的最大步数。
  • 更新能到达的最远区块编号:如果当前遍历到的区块编号i小于等于当前能到达的最远区块编号r,说明当前区块是可以到达的。在这种情况下,计算从当前区块出发能到达的最远位置,即i + x。然后取当前能到达的最远位置和之前记录的最远位置r中的较大值更新r。这样就确保了r始终记录着从起点出发能到达的最远区块编号。
  • 判断是否能到达目标区块:循环结束后,检查r是否大于等于目标区块编号n。如果是,则说明可以从第一个区块到达编号为n的区块,输出 “YES”;否则输出 “NO”。

总体来说,这个程序通过动态更新能到达的最远区块编号,逐步判断是否能够到达目标区块,利用了贪心算法的思想,每次都尽可能地走到最远的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值