即约分数
题目
思路
遍历所有的x,y,判断x/y是不是即越约分数。
代码
cpp
#include <iostream>
using namespace std;
int gcd(int x,int y)
{
int r;
while(y!=0)
{
r=x%y;
x=y;
y=r;
}
return x;
}
int main()
{
// 请在此输入您的代码
int sum=4039;//1/y和x/1都是
for(int x=2;x<=2020;x++)
{
for(int y=2;y<=2020;y++)
{
int m=gcd(x,y);
if(m==1) sum++;
}
}
cout<<sum;
return 0;
}
蛇形填数
题目
思路
设i为某个数所在行,j为某个数所在列。(i+j)为偶数时,蛇形矩阵往右上方走,(i+j)为奇数时,蛇形矩阵往左下方走。(20+20)为偶数,往右上方走。所以mat[20][20]=mat[39][1]+19=mat[38][1]+20=1+2+...+38+20;
代码
cpp
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int sum=0;
for(int i=1;i<=38;i++)
sum+=i;
sum+=20;
cout<<sum;
return 0;
}
七段码
题目
思路
总共七个二极管,每一个都可以选或不选,列举完七个二极管选或不选后,判断选好的二极管有没有连成一片(如果只选了一个那就不用判断)。
代码
cpp
#include<iostream>
using namespace std;
int used[10];
int sum;
int num;//使用灯泡的数量
bool find(int n)
{//找有没有与n相邻的灯泡在使用
switch (n)
{
case 1: if(used[2]||used[6]) return true; break;
case 2: if(used[1]||used[3]||used[7]) return true;break;
case 3: if(used[2]||used[4]||used[7]) return true;break;
case 4: if(used[3]||used[5]) return true;break;
case 5: if(used[4]||used[6]||used[7]) return true;break;
case 6: if(used[1]||used[5]||used[7]) return true;break;
case 7: if(used[2]||used[3]||used[5]||used[6]) return true;break;
}
return false;
}
void dfs(int depth)
{
if(depth>7)
{
if(num==1)
{
sum++;
return ;
}
for(int k=1;k<=7;k++)
{
if(used[k]==1&&!find(k))
{//如果在使用的灯泡没有相邻灯泡在使用,那不符合。
return ;
}
}
sum++;
return ;
}
//用这一个
used[depth]=1;
num++;
dfs(depth+1);
//不用这一个
used[depth]=0;
num--;
dfs(depth+1);
}
int main()
{
sum=0;
num=0;
dfs(1);
cout<<sum;
}
结果
这个代码直接提交会超时,估计是递归次数太多,但是题目要求输出结果即可。所以我们可以在dev上先运行出结果,然后直接提交输出那个结果。
跑步锻炼
题目
思路
遍历2000.1.1到2020.10.1的每一天,周一或初一就+2,否则+1,最后输出。
代码
cpp
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int sum=0;
int year=2000,month=1,day=1;
int week=6;
int a[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
//2000,2004,2008,2012,2016,2020
while(!(year==2020&&month==10&&day==2))
{
if(day==1||week==1){
sum+=2;
}else{
sum+=1;
}
day++;
if(week==7) week=1;
else week++;
week%=8;
//跨月
if(day==a[month]+1){
//跨年
if(month==12){
month=0;//出去还会+变成1
year++;
if(year==2004||year==2008||year==2012||year==2016||year==2020) a[2]=29;
else a[2]=28;
}
//跨越不跨年
month++;
day=1;
}
}
cout<<sum;
return 0;
}
结果
平方和
题目
思路
遍历1到2019计算平方和
代码
cpp
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
long long sum=14362;
for(int i=41;i<=99;i++)
{
int a=i%10;
int b=i/10;
if(a==2||a==0||a==1||a==9||b==0||b==1||b==9||b==2)
sum+=i*i;
}
for(long long i=100;i<=999;i++)
{
int a=i%10;
int b=i/10%10;
int c=i/100;
if(a==2||a==0||a==1||a==9||b==2||b==0||b==1||b==9||c==2||c==0||c==1||c==9)
sum+=i*i;
}
for(long long i=1000;i<=2019;i++)
{
int a=i%10;
int b=i/10%10;
int c=i/10/10%10;
int d=i/1000;
if(a==2||a==0||a==1||a==9||b==2||b==0||b==1||b==9||c==2||c==0||c==1||c==9||d==2||d==1||d==0||d==9)
sum+=i*i;
}
cout<<sum;
return 0;
}
结果
数列求值
题目
思路
从i=4开始遍历到20190324,维护前三项,遍历完成后输出第三项。
代码
cpp
#include <iostream>
using namespace std;
int main()
{
long long a=1,b=1,c=1,t;
for(int i=4;i<=20190324;i++)
{
t=(a+b+c)%10000;
a=b;
b=c;
c=t;
}
cout<<t;
return 0;
}
结果
总结
蓝桥杯的题目主要考的是数学和枚举的能力。