以下为个人场上所提交答案,欢迎大家指出错误,后续会更正正确题解。
个人提交:25
说明: Mbps是M bit per second, MB是 M Byte,bit是比特,Byte是字节,1Byte=8bit, 200/8=25
个人提交:21844 (有误)
改正:1903
说明:只有每个位都为1、3、5、7之一才是题目所说的纯质数。还有一个条件当时没注意到,这个数本身也要是素数,应该先用埃氏筛法。
代码:
#include<cstdio>
#include<cstring>
const int MAX_N = 20210605;
int num[MAX_N + 1];
int sum = 0;
void solve(int x) {
int isPrime = 1;
while(x > 0) {
int b = x%10; //b为x的个位数字
if(!(b == 2 || b == 3 || b == 5 || b == 7)) {
isPrime = 0;
break;
}
x = x/10;
}
if(isPrime) sum++;
}
int main() {
memset(num, 1, sizeof(num));
for(int i = 2; i < 20210605; i++) {
for(int j = 2; i*j <= 20210605; j++) {
num[i*j] = 0;
}
}
for(int i = 1; i <= 20210605; i++) {
if(num[i]) solve(i);
}
printf("%d\n", sum);
return 0;
}
个人提交:977
说明:现场写日期类太麻烦,直接用excel搞数据,然后用c处理
先在excel中敲入这两格内容,第三格做个差,看看一共有多少天
得7699,从A1格往下拉7669行,得到从2001/1/1到2021/12/31的每一天
为了方便处理数据,把刚才不用的删掉,并且把表格另存为.csv文件
数据有了,直接全选复制,接下来用c/c++处理
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int res = 0;
void solve(int x) {
for(int i = 0; i < 100; i++) {
if(i * i == x) res++;
}
}
int main() {
string line;
while(getline(cin, line)) {
int len = line.length();
int sum = 0;
for(int i = 0; i < len; i++) {
if(isdigit(line[i])) sum += line[i] - '0';
}
solve(sum);
cout << res << endl;
}
}
得出结果977
赛后听了老师讲,其实遍历所有日期也不难
#include<cstdio>
#include<cmath>
int days[] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main() {
int cnt = 0;
for(int year = 2001; year <= 2021; year++) {
if(year%4==0 && year%100!=0 || year%400 == 0) days[2] = 29; //闰年29天
else days[2] = 28; //平年28天
for(int month = 1; month <=12; month++) {
for(int day = 1; day <= days[month]; day++) {
int total = 0;
int t = year;
while(