第二届蓝桥杯国际赛真题 试题B:特殊日期

试题B:特殊日期

解题思路:
把输入的开始日期和结束日期两个八位数分别分解为年月日三个数,按照年月日进行一天一天的嵌套for循环,每循环一次都将当天的年月日三个数按顺序存储进一个一维数组后,判断此日期是否是一个特殊日期,如果是则指针加1。
写两个方法:
1.方法save用于将年月日的数据一个数字一个数字保存在一维数组中
2.方法isContinuous用于判断是否是特殊日期

参考文章:蓝桥杯竞赛题——“特殊日期”
在这里插入图片描述
在这里插入图片描述
两个方法:

class Fin{
	//存入数组
	public void save(int[]arr,int i,int j,int k) {
		//把年放入数组的前四个元素
		for (int x = 3;x>=0; x--) {
			arr[x]=i%10;
			i=i/10;
		}
		//放入“月”
		if (j<10) {
			arr[4]=0;
			arr[5]=j;
		}else {
			arr[4]=j/10;
			arr[5]=j%10;
		}
		//放入“日”
		if (k<10) {
			arr[6]=0;
			arr[7]=k;
		}else {
			arr[6]=k/10;
			arr[7]=k%10;
		}
	}
	
	//判断是否是特殊日期
	public Boolean isContinuous(int[] arr) {
		int t=1;
		for (int i = 0; i <7; i++) {//范围0~7是因为如果是0~8的话后边比较就是arr[7]==arr[8],arr[8]超出了数组范围运行会报错
			if (arr[i]==arr[i+1]) {
				t++;
			}else {
				t=1;
			}
			if(t==3) {
				return true;
			}
		}
		return false;
	}
}

代码展示:

public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		//起始日期
		int start=scanner.nextInt();
		//结束日期
		int end=scanner.nextInt();
		
		//分别割为年月日三个数
		int startyear=start/10000;
		int startmonth=start%10000/100;
		int startday=start%10000%100;
		
		int endyear=end/10000;
		int endmonth=end%10000/100;
		int endday=end%10000%100;
		
		int i,j,k,num=0;
		int[] arr=new int[8];
		Fin fin=new Fin();
		for (i = startyear; i <=endyear; i++) {
			//如果年份是开始年份份,则月的for循环中j=开始月份,如果是结束年份,则月的for循环中j<=结束月份,其他年都从1月开始到12月结束
			if (i==startyear) {
				for (j = startmonth; j<=12; j++) {
					//如果月份是开始月份,则日的for循环中startday<k<31,若不是,则日的for循环中1<k<31
					if (j==startmonth) {
						for (k=startday; k<=31; k++) {
							fin.save(arr, i, j, k);
							if(fin.isContinuous(arr)) {
								num++;
							}
						}
					}else if(j==endmonth){
						for (k=1; k<=endday; k++) {
							fin.save(arr, i, j, k);
							if(fin.isContinuous(arr)) {
								num++;
							}
						}
					}else {
						for (k=1; k<=31; k++) {
							fin.save(arr, i, j, k);
							if(fin.isContinuous(arr)) {
								num++;
							}
						}
					}
				}
			}else if (i==endyear) {
				for (j =1; j<=endmonth; j++) {
					//如果月份是结束月份,则日的for循环中1<k<endday,若不是,则日的for循环中1<k<31
					if (j==endmonth) {
						for (k=1; k<=endday; k++) {
							fin.save(arr, i, j, k);
							if(fin.isContinuous(arr)) {
								num++;
							}
						}
					}else {
						for (k=1; k<=31; k++) {
							fin.save(arr, i, j, k);
							if(fin.isContinuous(arr)) {
								num++;
							}
						}
					}
				}
			}else {
				for (j = 1; j<=12; j++) {
					for (k = 1; k <=31; k++) {
						fin.save(arr, i, j, k);
						if(fin.isContinuous(arr)) {
							num++;
						}
					}
				}
			}
		}
		
		System.out.println(num);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值