蓝桥杯刷题(四)
1.时间显示(注意审题)
2.七段码
3.路径
4.年号字符
5.棋盘放麦子
蓝桥杯题库
1.时间显示(注意审题)
这道题其实很简单,但我在提交时却总是通过不了…因为题目要求输入的时毫米,我把它看成了秒…找了半天都不知道错在了哪
include <stdio.h>
int main()
{
long long t = 0,n=0;
scanf("%lld", &t);
n=t/1000;//将毫秒转化为秒
long long day = n / 86400;//算出一共有多少天,注意这里除的是整数所以小数部分会自动舍弃
long long oneday = n - 86400 * day;//算出最后一天剩下多少秒
long long oneday_h = oneday / 3600;//算出这一天有多少小时
printf("%.2lld:", oneday_h);
long long oneday_m = (oneday - oneday_h * 3600) / 60;//算出有多少分
printf("%.2lld:", oneday_m);
long long oneday_s = oneday - oneday_h*3600-oneday_m * 60;//算出有多少秒
printf("%.2lld", oneday_s);
return 0;
}
2.七段码
这道题建议手撸,暴力法
include <stdio.h>
include <stdlib.h>
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int sum = 0;
//有一段二极管发光; a,b,c,d,e,f,g
int l1 = 7;
//有两段二极管发光; ab,af,bc,bg,cg,cd,de,eg,ef,fg
int l2 = 10;
//有三段二极管发光; abf,abc,abg,afg,afe,bcd,bcg,bgf,bge,cgd,cgf,cge,cde,cdg,deg,def,efg
int l3 = 16;//
//有四段二极管发光; abcd,abcg,abcf,abge,abgf,abfe,afeg,bcde,bcdg,bcgf,bcge,bged,bgef,cdef,cdeg,cdgf,cgfa,cgfe,defg,defa
int l4 = 20;
//有五段二极管发光即有两端不发光; ab,ac,ad,ae,af,ag,bc,bd,be,bg,cd,cf,cg,de,df,dg,ef,eg,fg
int l5 = 19;//
//有六段二极管发光即有一端不发光; a,b,c,d,e,f,g
int l6 = 7;//(找一段二极管不发光的:)
//第七种情况,全部发光
int l7 = 1;
sum = l1 + l2 + l3 + l4 + l5 + l6 + l7;
printf("%d\n", sum);
return 0;
}
当然也可以用程序写出来,但很麻烦,反正我是手算的
include<stdio.h>
include<stdlib.h>
int main(){
int a,b,c,d,e,f,g;
int number=0;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
for(e=0;e<=1;e++)
for(f=0;f<=1;f++)
for(g=0;g<=1;g++)
{
if((a==1&&(b==1||f==1))||a==0)
if((b==1&&(a==1||g==1||c==1))||b==0)
if((c==1&&(b==1||g==1||d==1))||c==0)
if((d==1&&(c==1||e==1))||d==0)
if((e==1&&(g==1||d==1||f==1))||e==0)
if((f==1&&(a==1||g==1||e==1))||f==0)
if((g==1&&(f==1||b==1||e==1||c==1))||g==0){
if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0&&g==0)
break;
else
number++;
}
}
printf("%d",number+7-3);
}
3.路径
这道题其实用到了一个枚举累加的方法,得出每两个点之间(注意是每两个点的)的最小公倍数,然后取最小的,依次相加
include <stdio.h>
include <stdlib.h>
int gcd(int x,int y)
{
int r;
r=x%y;
while(r!=0)
{
x=y;
y=r;
r=x%y;
}
return y;
}//辗转相除法求最大公因数
int lcm(int x,int y)
{
return (x*y/gcd(x,y));
}//最小公倍数
int min(int a,int b)
{
return a<b?a:b;
}//得出小的那个
int main()
{
int i=1;
int j;
int f[2022]={0};
for(i=1;i<=2021;i++)
{
for(j=i+1;j<=i+21&&j<=2021;j++)//依次得出i点到它后面21个点的公倍数
{
if(f[j]==0)//如果这个j位置还没存放公倍数
{
f[j]=f[i]+lcm(i,j);//那么就放入从i点到该点的公倍数并加上之前走的路径长度
}
else
{
f[j]=min(f[j],f[i]+lcm(i,j));//如果该点已经存放了一个公倍数,那么就意味着之前已经计算过从某一个i点到该点的公倍数(因为多个不同点可以到达同一点),比较现在的i点到该点的公倍数,取较小的
}
}
}
printf("%d",f[2021]);
return 0;
}
4.年号字符
这道题很简单,推荐使用暴力手算法,其实本质上就是一个26进制的转换,当然我在这还是演示一下程序写法
include <stdio.h>
int main()
{
int n=2019,j=0,len=0;
char arr[10]={0};
while(n%26!=0)
{
arr[j++]=(n%26-1)+'A';
n=n/26;
}//辗转相除法
for(int i=0;i<10;i++)
{
if(arr[i]!=0)
{
len++;
}
}
for(int i=len-1;i>=0;i--)
{
printf("%c",arr[i]);
}//将每个字符逆序打印出来
return 0;
}
5.棋盘放麦子
相信大家在小时候就听过这个故事,其实这道题很简单,就是求2的多少次方再累加,但需要注意的是溢出,这里只有unsigned long long(2^64-1)能放下
include <stdio.h>
include<math.h>
int main()
{
unsigned long long i=0,sum=0,k=0;
for(i=0;i<64;i++)
{
k=(long long)pow(2,i);
sum+=k;
}
printf("%llu",sum);
return 0;
}