Rise of Shadows(数学判断)
题目描述
运行代码(逐步判断)
#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)。
- 思路:根据闰年的定义,如果年份能被 4 整除但不能被 100 整除,或者能被 400 整除,那么这个年份就是闰年,返回
- 首先读取测试用例的数量
T
。 - 进入
while
循环,循环T
次,每次处理一个年份的判断。- 在循环内部,读取一个年份
year
。 - 调用
isLeapYear
和isPrime
函数判断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;
}
转"人工"(字符加逻辑转换)
题目描述
运行代码
#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
模式等,所以只需要关注最后一个指令字符即可确定最终模式。
马弓手关羽请战华雄(加法运算)
题目描述
运行代码
#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”。
总体来说,这个程序通过动态更新能到达的最远区块编号,逐步判断是否能够到达目标区块,利用了贪心算法的思想,每次都尽可能地走到最远的位置。