目录
试题来源:蓝桥杯2020第十一届C语言B组省赛习题题解_shall_zhao的博客-CSDN博客_蓝桥杯c语言题目
试题A.门牌制作(拆分数字)
思路解析:遍历1~2020,统计每个数字中2的次数,运用到拆分数字的基本算法
#include<iostream>
using namespace std;
int cal(int num)
{
int cnt = 0;
while (num)
{
int j = num % 10;
if (j == 2) cnt++;
num /= 10;
}
return cnt;
}
int main()
{
int res = 0;
for (int i = 1; i <= 2020; i++)
{
res += cal(i);
}
cout << res << endl;//答案为624
return 0;
}
试题 B 既约分数(gcd)
思路解析:两层内外循环遍历1~2020,用欧几里得算法判断是否是两数的最大公约数为1,统计个数即可
#include<iostream>
using namespace std;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int res = 0;
for(int i=1;i<=2020;i++)
for (int j = 1; j <= 2020; j++)
{
if (gcd(i, j) == 1) res++;
}
cout << res << endl;//答案为:2481215
return 0;
}
试题C 蛇形填数(数学)
问题: 根据此规律,推断第20行20列的数字是多少,其中第2行第2列的数字为5
思路解析:
(1)对于奇数行有:比如说数字‘4’的那一行,则有:从它向它的右上角方向依次+1
(2)对于偶数行有:比如说数字‘10’的那一行,则有:从它向它的右上角方向依次-1
那么同理:
(3)对于奇数列有:比如说数字‘6’的那一列,则有:从它向它的左下角方向依次-1
(4)对于偶数列有:比如说数字‘7’的那一列,则有:从它向它的左下角方向依次+1
那么就有:
定义一个计数器cnt=1,循环for一次,同时枚举(i)行数和列数,如果这个(i)为奇数,那么就让它对应(1)情况,让它向右上角方向++;同理如果这个(i)为偶数,那么就让它对应(4)情况,让它向它的左下角方向++,其中是将cnt的值赋给这个二维数组,并++,最后输出对应行数和列数即可
#include<iostream>
using namespace std;
const int N = 110;
int a[N][N];
int main()
{
int cnt = 1;
int x, y;
for (int i = 1; i <= N; i++)
{
if (i % 2 == 1)
{
for (x = i, y = 1; x >= 1 && y <= i; x--, y++)
{
a[x][y] = cnt++;
}
}
else
{
for (x = 1, y = i; x <= i && y >= 1; x++, y--)
{
a[x][y] = cnt++;
}
}
}
cout << a[20][20] << endl;
return 0;
}
试题D 跑步锻炼(模拟)
问题:
思路解析:
最外层循环枚举年份ÿ