蓝桥杯刷题(四)


在这里插入图片描述

蓝桥杯题库

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;
}
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸蛋挞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值