试题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);
}