3月月赛丙组题 https://iai.sh.cn/contest/3
打鱼还是晒网
-
5天一个周期,如果 n 除以5的余数是4或者0,就是晒网;否则就是打鱼
-
注意:任何正整数除以 r 的余数的范围是 0 ~ (r-1)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n%5==0 || n%5==4) cout << "Lying" << endl;
else cout << "Fishing" << endl;
return 0;
}
数字加密
- 这题方法很多,可以把输入当做一个整型变量,也可以把输入当做字符串
整型变量
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
cout << 9 - n%10;
cout << 9 - n/10%10;
cout << 9 - n/100%10;
cout << 9 - n/1000;
return 0;
}
字符数组
#include <iostream>
using namespace std;
int main() {
char c[4];
cin >> c;
for (int i = 3; i >= 0; i--) {
c[i] = char('0' + '9' - c[i]);
cout << c[i];
}
return 0;
}
双质数
- 没什么好说的,判断质数的模板题。一定要把判断质数的函数熟练默写出来
- 主程序要枚举的数字不超过 2 ∗ 1 0 5 2*10^5 2∗105。判断质数的代码时间复杂度是 O ( n ) O(\sqrt{n}) O(n),表面上看会超时,但大部分数字是合数,很快就会找出因子,函数中实际循环次数很少
- 掌握这道题里布尔变量的用法:
- 设置布尔变量 flag,并初始化为“真”
- 在循环过程中,如果某条件成立,则将 flag 修改为“假”
- 循环结束后,如果 flag 仍然为假,就说明循环里的条件没有成立过
#include <iostream>
using namespace std;
bool isPrime(int x) {
if (x < 2) return false;
for (int i = 2; i <= x/i; i ++ ) {
if (x % i == 0) {
return false;
}
}
return true;
}
int main() {
int a, b;
cin >> a >> b;
bool flag = true;
for (int i = a; i <= b; i ++ ) {
if (isPrime(i) && isPrime(i/10)) {
flag = false;
cout << i << endl;
}
}
if (flag) cout << "None" << endl;
return 0;
}
连乘问题
- 很多同学会先用循环计算 a 1 ∗ a 2 ∗ a 3 . . . a n % 10000 a_1*a_2*a_3...a_n \%10000 a1∗a2∗a3...an%10000,再除以 a i a_i ai,这样计算的结果是不对的,我们来看下面的例子
- 123 ∗ 456 12 % 10000 = 4674 \displaystyle\frac{123*456}{12}\%10000=4674 12123∗456