A: 门牌制作
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、 0、 1、 7,即需要 1 个字符 0, 2 个字符 1, 1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
#include <iostream>
using namespace std;
int res;
int main() {
for (int i = 1; i <= 2020; i ++) {
int x = i;
int t;
while(x){
t = x % 10;
if(t == 2) res ++;
x /= 10;
}
}
cout << res;
}
// 624
B: 既约分数
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,3/4 , 5/2 , 1/8 , 7/1都是既约分数。请问,有多少个既约分数,分子和分母都是1 到2020 之间的整数(包括1和2020)?
#include <iostream>
using namespace std;
int res;
int gcb(int a, int b) {
return b ? gcb(b, a % b) : a;
}
int main(){
for(int i = 1; i <= 2020; i ++) {
for(int j = 1; j <= 2020; j ++) {
if(gcb(i, j) == 1) res ++;
}
}
cout << res;
}
// 2481215
C:蛇形填数
如下图所示,小明用从1 开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20 行第20 列的数是多少?
找规律:1, 5, 13, 25…
每次差的值是 4 8 12 16…
#include <iostream>
using namespace std;
int main() {
int res = 1;
int k = 4;
for(int i = 1; i < 20; i ++) {
res += k;
k += 4;
}
cout << res;
}
// 761
参考: csdn
D :跑步训练
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
#include<iostream>
using namespace std;
int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 判断闰年
int checked(int year){
if( year % 4 == 0 && year % 100 || year % 400 == 0) return 1;
else return 0;
}
int main()
{
int y, m, d;
int w = 6; // 初始为周六
int step = 0; // 公里数
// 遍历每一天 year : month : day : weak
for(y = 2000; y <= 2020; y ++)
for(m = 1; m <= 12; m ++)
for(d = 1; d <= day[m] + ((m == 2) ? checked(y) : 0); d ++, w = w % 7 + 1)
{
step ++;
if(d == 1 || w == 1) step ++;
if(y == 2020 && m == 10 && d == 1) cout << step;
}
return 0;
}
// 8879
E :七段码
小蓝要用七段码数码管来表示一种特殊的文字。
// TODO
F:成绩统计
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int g[N];
double sum;
double avg;
int maxv = -1, minv = 200;
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i ++) {
cin >> g[i];
sum += g[i];
maxv = max(maxv, g[i]);
minv = min(minv, g[i]);
}
double k = (double) n;
cout << maxv << endl;
cout << minv << endl;
printf("%0.2f", sum / k);
return 0;
}
G:回文日期
【问题描述】
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd” 的格式写成一个8 位数是20200202,
恰好是一个回文数。我们称这样的日期是回文日期。
有人表示20200202 是“千年一遇” 的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202 即2021年12月2日。
也有人表示20200202 并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100 年后就能遇到下一个ABABBABA 型的回文日期:21211212 即2121 年12 月12 日。算不上“千年一遇”,顶多算“千年两遇”。
给定一个8 位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。
#include <iostream>
using namespace std;
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 判断日期合法性
bool checked (int n) {
int year = n / 10000;
int month = n % 10000 / 100;
int day = n % 10000 % 100;
if(month == 2) {
if(year % 100 && year % 4 == 0 || year % 400 == 0) {
if(day > days[2] + 1 || day < 1) return false;
}
if(day > days[2] || day < 1) return false;
} else {
if(month < 1 || month > 12) return false;
if(day > days[month] || day < 1) return false;
}
return true;
}
// 判断格式是否是 abab
bool checkabab (int n) {
int a, b, c, d;
a = n / 1000;
b = n / 100 % 10;
c = n % 100 / 10;
d = n % 100 % 10;
if(a == c && b == d && a != b) return true;
else return false;
}
// 判断是否是回文日期
bool checkhw(int n){
int hw = n / 10000;
int w = hw;
for (int j = 0; j < 4; j ++ ) {
hw = hw * 10 + w % 10;
w /= 10;
}
if(hw == n) return true;
else return false;
}
int main() {
int n;
cin >> n;
// 判断输入值是否回文
bool flag = false;
if(checkhw(n)) flag = true;
int res = 0;
int k = n / 10000;
if(flag) k ++;
for(int i = k ; i <= 100000; i ++) {
int hw = i;
int w = i;
for (int j = 0; j < 4; j ++ ) {
hw = hw * 10 + w % 10;
w /= 10;
}
if(checked(hw) && hw > n) {
res ++;
cout << hw << endl;
break;
}
}
res = 0;
for(int i = k ; i <= 100000; i ++) {
if(checkabab(i)){
int hw = i;
int w = i;
for (int j = 0; j < 4; j ++ ) {
hw = hw * 10 + w % 10;
w /= 10;
}
if(checked(hw)) {
res ++;
cout << hw << endl;
break;
}
}
}
return 0;
}
H :字串分值
问题描述】
对于一个字符串 S,我们定义 S 的分值 f (S ) 为 S 中出现的不同的字符个数。例如 f (”aba”) = 2, f (”abc”) = 3, f (”aaa”) = 1。
现在给定一个字符串 S [0::n − 1](长度为 n),请你计算对于所有 S 的非空子串 S i:: j, f (S [i:: j]) 的和是多少。
过一半数据,暴力set去重
#include <iostream>
#include <set>
using namespace std;
int res;
int main() {
string str;
cin >> str;
for(int i = 0; i < str.size(); i ++) {
set<char> s;
for(int j = i; j < str.size(); j ++) {
s.insert(str[j]);
res += s.size();
}
}
cout << res;
}
求关注
🥰