蓝桥杯 【日期统计】【01串的熵】

文章讲述了作者在编程中遇到的问题,如何通过代码判断一个给定的数字序列(代表日期)是否能按照下标顺序组成有效的2023年日期。代码展示了遍历和检查日期合法性的过程。
摘要由CSDN通过智能技术生成

日期统计

第一遍写的时候会错了题目的意思,我以为是一定要八个整数连在一起构成正确日期,后面发现逻辑明明没有问题但是答案怎么都是错的才发现理解错了题目的意思,题目的意思是按下标顺序组成,意思就是可以不连续,我还是把它想得太简单啦

这是一段判断连续下标可以组成日期的代码,我利用了一个数组判断该日期是否在前面出现过

#include<stdio.h>
int main(){
int count[10000]={0};//方便判断日期是否出现过
int charge[13];//判断月份对应的日期是否合法
int shuzu[100];
int i,year,day,month,t=0;
for(i=0 ; i<100 ; i++)
{
  scanf("%d",&shuzu[i]);//输入数组
}
for(i=1 ; i<=12 ; i++){//初始化charge
  if(i==2){
    charge[i]=28;
  }
  else if(i==4 || i==6 || i==9 || i==11 ){
    charge[i]=30;
  }
  else{
    charge[i]=31;
  }
}
for(i=0 ; i<92 ;i++){
  year=shuzu[i]*1000+shuzu[i+1]*100+shuzu[i+2]*10+shuzu[i+3];
  month=shuzu[i+4]*10+shuzu[i+5];
  day=shuzu[i+6]*10+shuzu[i+7];
  if(year==2023){
    if(0<month && month<=12){
      if(day>0 && day<=charge[month]){
        if(count[month*100+day]==0){
        t++;
        count[month*100+day]=1;
        }
      }
    }
  }
}
printf("%d",t);
return 0;
}

这是正确的代码,逐个遍历2023年的每一天,并查找给出数组是否有相同

#include <stdio.h>

int main() {
    int array[100] = {
        5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,
        5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,
        2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3,
        8, 5, 1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6,
        1, 4, 0, 1, 0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3
    };

    int daysInMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int ans = 0;
	int month,day,i;
    for ( month = 1; month <= 12; ++month) {
        for ( day = 1; day <= daysInMonth[month]; ++day) {
            int dateSeq[8] = {2, 0, 2, 3, month / 10, month % 10, day / 10, day % 10};
            int k = 0;

            for ( i = 0; i < 100; ++i) {
                if (array[i] == dateSeq[k]) {
                    ++k;
                    if (k == 8) {
                        ans++;
                        break;
                    }
                }
            }
        }
    }

    printf("%d\n", ans);
    return 0;
}

01串的熵

不要被题目吓到啦,暴力遍历就好,我一开始混用了double与int,结果发现i不能是float,只能是int,因为后面要输出(又是被小错误绊倒)

#include <stdio.h>
#include <math.h>
int main()
{
  double max=23333333,Sum;
  int i;
  for(i=0 ; i<=max/2 ;i++){
    Sum=0;
    Sum-=i*(i/max)*log2(i/max)+(max-i)*((max-i)/max)*log2((max-i)/max);
    if(Sum > 11625907.5 && Sum < 11625907.6){
      printf("%d",i);
      break;
    }
  }
  return 0;
}

冶练金属

一遍过

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int n,i,j;
  scanf("%d",&n);
  int a[n],b[n];//用两个数组分别储存输入
  int min[n],max[n],n_min,n_max;
  for(i=0;i<n;i++){
    scanf("%d %d",&a[i],&b[i]);
    max[i]=a[i]/b[i];//获取单个最大V
    min[i]=max[i];
    while(a[i]/min[i]==b[i]){
      min[i]--;
    }//获取单个最小V
    min[i]++;//循环出来的是不满足题意的,所以加一
  }
  n_min=1000000;//在所有最大的里面找最小的才能满足所有
  for(i=0;i<n;i++){
    if(max[i]<n_min)
    {
      n_min=max[i];
    }
  }
  n_max=0;//在所有最小的里面找最大的
  for(i=0;i<n;i++){
    if(min[i]>n_max)
    {
      n_max=min[i];
    }
  }
  printf("%d %d",n_max,n_min);//注意输出顺序
  return 0;
}

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值