题目描述:
小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。请问要制作所有的1到2020号门牌,总共需要多少个字符2?
题目分析:
该题为填空题,直接暴力求解。
#include
#include
#include
int count(int x)
{
int num=0;
while(x)
{
if(x%10==2)
num++;
x=x/10;
}
return num;
}
int main()
{
int sum=0;
for(int i=1;i<=2020;i++)
sum+=count(i);
printf("%d",sum);
return 0;
}
答案:
624
题目描述
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,3/4,5/2,1/8,7/1都是既约分数。请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020)
题目分析
由于是填空题,我选择的依然是傻瓜式做法,直接遍历。
#include
#include
#include
int maxgcd(int x,int y)
{
int t=x>y?y:x;
for(int i=t;i>=1;i--)
{
if(x%i==0&&y%i==0)
return i;
}
}
int main()
{
int ans=0;
for(int i=1;i<=2020;i++)
{
for(int j=1;j<=2020;j++)
{
if(maxgcd(i,j)==1)ans+=maxgcd(i,j);
}
}
printf("%d",ans);
return 0;
}
答案:
2481215
题目描述
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …
11 …
题目分析
可以将图形顺时针旋转45度,我们可以发现20行20列应该位于第39行的中间一个,然后模拟就可以算出来了
1行1列 1
3 2
2行2列 4 5 6
10 9 8 7
3行3列 11 12 13 14 15
.................//一共会有2*n-1行,行号等于该行数字个数,每行最大的数为第一行到该行的行号和
#include
#include
#include
int main()
{
int endmax=(1+39)*39/2;
int endmin=endmax-39+1;
printf("%d",(endmax+endmin)/2);
return 0;
}
答案:
761
题目描述小蓝每天都锻炼身体。正常情况下,小蓝每天跑1千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。请问这段时间小蓝总共跑步多少千米?
题目分析
首先算出总的天数,和月份数,然后求出一共有多少个周一,和周一中为月份的天数
最后总天数+周一天数+月初天数 - 周一和月初重合天数。当然也可以暴力求解。
#include
#include
#include
int mounth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int sum=0,Monday=0,monfristday=0,recount=0;
for(int i=2000;i<=2020;i++)
{
if((i%4==0&&i%100!=0)||i%400==0)mounth[2]=29;
else mounth[2]=28;//这里有必要加个else
for(int j=1;j<=12;j++)
{
if(i==2020&&j==10)break;
sum+=mounth[j];
if((sum+1)%7==3)recount++;//即是初一又是周一
monfristday++;
}
}
monfristday++;//10月1号也要算进来
Monday+=(sum+1)/7;
if((sum+1)%7>=3)Monday++;
printf("%d",sum+1+Monday+monfristday-recount);//sum需要加1,10月1号也要算进来
return 0;
}
答案:
8879
题目描述
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。
这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
题目分析
- 用
1 ~ 7
来代表a ~ g
;- 若某两个二极管相邻,那么就在它们之间连一条边;
- 先用
dfs
枚举出二极管的所有亮灭情况;- 再用
并查集
判断是否只有一个连通块;
#include
#include
int light[10],e[10][10],fa[10];
int find(int x)
{
if(fa[x]==x)return x;
fa[x]=find(fa[x]);
return fa[x];
}
void unionn(int x,int y)
{
int dx=find(x),dy=find(y);
if(dx==dy)return;
else fa[dx]=dy;
}
int ans;
void dfs(int x)
{
if(x>7)
{
for(int i=1; i<=7; i++)fa[i]=i;
for(int i=1; i<=7; i++)
for(int j=1; j<=7; j++)
{
if(light[i]&&e[i][j]&&light[j])
{
unionn(i,j);
}
}
int k=0;
for(int i=1; i<=7; i++)
if(light[i]&&fa[i]==i)
k++;
if(k==1)ans++;
return;
}
light[x]=1;
dfs(x+1);
light[x]=0;
dfs(x+1);
}
int main()
{
e[1][2] = e[1][6] = 1;
e[2][1] = e[2][7] = e[2][3] = 1;
e[3][2] = e[3][7] = e[3][4] = 1;
e[4][3] = e[4][5] = 1;
e[5][4] = e[5][7] = e[5][6] = 1;
e[6][1] = e[6][7] = e[6][5] = 1;
e[7][2] = e[7][3] = e[7][5] = e[7][6] = 1;
dfs(1);
printf("%d",ans);
return 0;
}
答案:
80