2017百度之星初赛:A-1005. 今夕何夕

今夕何夕

 
 Accepts: 1345
 
 Submissions: 5533
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
Problem Description

今天是2017年8月6日,农历闰六月十五。

小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨。

为了排遣郁结,它决定思考一个数学问题:接下来最近的哪一年里的同一个日子,和今天的星期数一样?比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。

小贴士:在公历中,能被4整除但不能被100整除,或能被400整除的年份即为闰年。

Input

第一行为T,表示输入数据组数。

每组数据包含一个日期,格式为YYYY-MM-DD。

1 ≤ T ≤ 10000

YYYY ≥ 2017

日期一定是个合法的日期

Output

对每组数据输出答案年份,题目保证答案不会超过四位数。

Sample Input
3
2017-08-06
2017-08-07
2018-01-01
Sample Output
2023
2023
2024


一年一年的加,直到天数差是7的倍数

注意特殊情况:日期是2月29日的,特判就好了

两组很强的数据:

2016-2-29

2096-2-29

答案:
2044  2108
#include<stdio.h>
int main(void)
{
	int T, y, m, d, now, sum;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d-%d-%d", &y, &m, &d);
		if(m==2 && d==29)
		{
			now = y;
			sum = 0;
			while(sum==0 || sum%7!=0)
			{
				now += 4;
				sum += 1461;
				if(now%100==0 && now%400!=0)
				{
					now += 4;
					sum += 1460;
				}
			}
			printf("%d\n", now);
		}
		else if(m<=2)
		{
			sum = 0;
			now = y;
			while(sum==0 || sum%7!=0)
			{
				if(now%4==0 && now%100!=0 || now%400==0)
					sum += 366;
				else
					sum += 365;
				now++;
			}
			printf("%d\n", now);
		}
		else
		{
			sum = 0;
			now = y;
			while(sum==0 || sum%7!=0)
			{
				now++;
				if(now%4==0 && now%100!=0 || now%400==0)
					sum += 366;
				else
					sum += 365;
			}
			printf("%d\n", now);
		}
	}
	return 0;
}

<think>好的,我现在需要解决用户的问题:在axios.js中捕获504状态码,然后通过Vue的事件总线或Vuex触发所有页面显示离线提示和刷新按钮。让我先理清楚思路。 首先,用户提到了两种方法:事件总线和Vuex。我需要先回忆这两种方法的具体实现步骤。根据用户提供的引用内容,事件总线是通过$eventBus使用$emit和$on来通信的,而Vuex是状态管理模式,可能需要修改状态然后让组件响应式更新。 用户的需求是在axios的拦截器中捕获到504错误,然后全局通知各个组件。这时候,无论是事件总线还是Vuex,都需要在拦截器中触发相应的动作,比如发送事件或者提交mutation。 首先考虑事件总线的方式。根据引用[3]和[4],在main.js中注册事件总线,然后在需要的地方使用$emit触发事件。例如,在拦截器中捕获到504时,用$bus.$emit('offline'),然后各个组件监听这个事件,并更新自己的状态显示提示。不过要注意的是,事件总线需要在axios.js中可以访问到Vue实例,或者已经将事件总线挂载到Vue原型上,比如this.$bus。但axios拦截器中的this可能不是Vue实例,所以可能需要导入事件总线的实例。比如在创建eventBus的时候导出,然后在axios.js中引入并使用。 接下来是Vuex的方式。用户需要修改状态树中的某个状态,比如offlineMode为true。然后在拦截器中,通过store.commit来触发mutation,改变这个状态。各个组件则通过computed属性或者watch来监听这个状态的变化,从而显示或隐藏提示。不过,在axios.js中如何访问Vuex的store实例呢?通常需要在拦截器文件中导入store,例如在创建axios实例的时候,或者在拦截器配置中引入store。 现在需要具体步骤。对于事件总线: 1. 在main.js或者一个单独的文件中创建事件总线,并挂载到Vue原型上。如引用[3]中提到的,在global.js中安装插件,可能包括事件总线的设置。或者如引用[2]中提到的,在main.js中注册总线。例如: ```js // main.js Vue.prototype.$bus = new Vue(); ``` 2. 在axios的拦截器中,当检测到504错误时,触发事件: ```js import Vue from 'vue'; // 或者直接使用this.$bus,但要注意作用域,可能需要通过Vue.prototype访问 // 在axios拦截器内部: error => { if (error.response.status === 504) { Vue.prototype.$bus.$emit('offline', true); } } ``` 或者如果事件总线是单独导出的实例,比如在eventBus.js中: ```js import Vue from 'vue'; export const EventBus = new Vue(); ``` 然后在axios.js中导入EventBus,并触发事件。 3. 在各个组件中监听这个事件,并更新组件的data属性,从而显示提示。例如: ```js created() { this.$bus.$on('offline', (isOffline) => { this.showOfflineAlert = isOffline; }); }, beforeDestroy() { this.$bus.$off('offline'); } ``` 对于Vuex的方式: 1. 在store中定义状态,例如: ```js state: { isOffline: false }, mutations: { SET_OFFLINE(state, value) { state.isOffline = value; } } ``` 2. 在axios拦截器中,导入store并提交mutation: ```js import store from './store'; // 在响应拦截器的错误处理中: if (error.response.status === 504) { store.commit('SET_OFFLINE', true); } ``` 3. 在组件中,通过mapState或者计算属性获取isOffline的值,并在模板中根据该值显示提示。例如: ```js computed: { ...mapState(['isOffline']) } ``` 然后在模板中使用v-if="isOffline"来显示提示框。 现在需要考虑哪种方法更合适。事件总线适合较小的项目,或者不需要复杂状态管理的情况。而Vuex更适合中大型项目,尤其是需要多个组件共享状态的情况。用户的问题需要全局通知所有页面,可能涉及到多个组件,因此Vuex可能更合适,但事件总线也能实现。 另外,用户提到在axios.js中使用拦截器,这里可能需要确保事件总线或store的引入是正确的。比如,如果在axios的配置文件中,如何访问到Vue实例的事件总线或者store。例如,在axios.js中,如果已经导入了store,就可以直接使用store.commit。而事件总线可能需要导出一个实例,然后在拦截器中触发。 同时,需要注意错误处理的位置。通常在axios的响应拦截器中检查错误状态码。例如: ```js axios.interceptors.response.use( response => response, error => { if (error.response && error.response.status === 504) { // 触发事件或提交mutation } return Promise.reject(error); } ); ``` 此外,用户希望显示刷新按钮,可能需要在触发事件或改变状态时,同时传递一些信息,比如错误消息,或者提供一个重试的方法。但根据问题描述,主要需要触发显示离线提示和刷新按钮,所以可能只需要一个布尔值状态即可。 最后,在组件中如何处理。对于事件总线,组件需要监听事件并更新本地数据,进而显示UI。对于Vuex,组件通过响应式状态自动更新UI。 现在需要检查用户提供的引用内容是否有帮助。引用[2]提到了事件总线的方法,使用$emit和$on。引用[4]提到在组件中监听事件的方式,比如this.$bus.on('add', this.event_xxx),这里可能需要注意Vue的版本或写法是否正确,通常Vue中使用$on方法。 综合以上分析,用户的问题可以通过两种方法解决。接下来需要给出具体的实现步骤,并回答用户的问题,同时生成相关问题。</think>### 解决方案 在Axios拦截器中捕获504状态码后,可以通过**事件总线**或**Vuex状态管理**全局触发组件更新。以下是两种实现方式的具体步骤: --- ### **方法1:使用事件总线(Event Bus)** 1. **创建事件总线** 在`main.js`中注册全局事件总线: ```javascript Vue.prototype.$bus = new Vue(); ``` 2. **在Axios拦截器中触发事件** 在`axios.js`的响应拦截器中捕获504错误并发送事件: ```javascript import axios from 'axios'; import Vue from 'vue'; axios.interceptors.response.use( response => response, error => { if (error.response?.status === 504) { Vue.prototype.$bus.$emit('offline', true); // 触发离线事件 } return Promise.reject(error); } ); ``` 3. **在组件中监听事件** 各页面组件监听`offline`事件并更新状态: ```javascript export default { data() { return { showOfflineAlert: false }; }, created() { this.$bus.$on('offline', (isOffline) => { this.showOfflineAlert = isOffline; }); }, beforeDestroy() { this.$bus.$off('offline'); // 避免内存泄漏 } }; ``` 4. **模板中显示提示** 在组件模板中通过`v-if`控制提示框: ```html <div v-if="showOfflineAlert"> <p>网络已断开,请检查连接后重试!</p> <button @click="window.location.reload()">刷新页面</button> </div> ``` --- ### **方法2:使用Vuex状态管理** 1. **定义Vuex状态** 在Store中定义全局状态`isOffline`: ```javascript // store.js export default new Vuex.Store({ state: { isOffline: false }, mutations: { SET_OFFLINE(state, value) { state.isOffline = value; } } }); ``` 2. **在Axios拦截器中更新状态** 在`axios.js`中导入Store并提交Mutation: ```javascript import store from './store'; axios.interceptors.response.use( response => response, error => { if (error.response?.status === 504) { store.commit('SET_OFFLINE', true); // 更新离线状态 } return Promise.reject(error); } ); ``` 3. **在组件中绑定状态** 通过计算属性或`mapState`获取状态值: ```javascript export default { computed: { isOffline() { return this.$store.state.isOffline; } } }; ``` 4. **模板中响应式显示提示** ```html <div v-if="isOffline"> <p>网络已断开,请检查连接后重试!</p> <button @click="window.location.reload()">刷新页面</button> </div> ``` --- ### **两种方法的对比** - **事件总线**:适合小型项目或简单场景,无需引入Vuex的复杂度[^2]。 - **Vuex**:适合中大型项目,提供集中式状态管理,避免组件间传递事件的繁琐。 --- ### **注意事项** 1. **错误处理作用域**:确保Axios拦截器中能访问到事件总线或Store实例。 2. **内存泄漏**:组件销毁时需通过`beforeDestroy`卸载事件监听[^4]。 3. **重试逻辑**:刷新按钮可调用`window.location.reload()`或自定义重试请求逻辑。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值