OpenJ_Bailian - 2723 C - 不吉利日期

OJ地址:https://vjudge.net/problem/OpenJ_Bailian-2723

在国外,每月的13号和每周的星期5都是不吉利的。特别是当13号那天恰好是星期5时,更不吉利。已知某年的一月一日是星期w,并且这一年一定不是闰年,求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1..7)

Input

输入有一行,即一月一日星期几(w)。(1 <= w <= 7)

Output

输出有一到多行,每行一个月份,表示该月的13日是星期五。

Sample Input

7

Sample Output

1
10

Hint

1、3、5、7、8、10、12月各有31天
4、6、9、11月各有30天
2月有28天

思路:

这是一道日期计算的题目,我们可以对每一天进行遍历,标记出每一个周五和每一个13号:

  • 先定义一个数组a[365]并初始化为false,将每一个周五标记成true;
  • 再找出每一个13号,查看其对应的数组a,是否为true,是则输出月份;

程序代码:

#include 
int main(){
	int x;
	scanf("%d",&x);
	int a[365] = {false};
	int ans1=0;
	if(x==1||x==2||x==3||x==4||x==5) {
		ans1=5-x;
	}else{
		ans1=12-x;
	}
	for(int i=ans1+1;i<366;i=i+7){
		a[i]=true;
	}
	int b[365] = {false};
	int ans = 13;
	b[ans]=true;
	if(a[ans]==true){
		printf("1\n");
	}
	for(int i=2;i<13;i++){
		int j=i-1;
		if(j==1||j==3||j==5||j==7||j==8||j==10||j==12){
			ans+=31;
		}else if(j==2){
			ans+=28;
		}else{
			ans+=30;
		}
		if(a[ans]==true){
			printf("%d\n",i);
		}
	}
	return 0; 
}

运行结果:

OpenJ_Bailian - 2723 C - 不吉利日期_第1张图片

以上是我的解法,下面看一种更为优质的解法:

#include 
using namespace std;
const int DAYS = 7;
const int N = 13;
enum DAY {MON=1, TUE, WED, THU, FRI, SAT, SUN};
int days[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(){
    int w, day;
    cin >> w;
    for(int i=1; i<=12; i++) {
        day = (w - 1 + N) % DAYS;
        if(day == FRI)
            cout << i << endl;
        w = (w + days[i-1]) % DAYS;
    }
    return 0;
}

以上解法转于:https://blog.csdn.net/tigerisland45/article/details/69791524

你可能感兴趣的:(#,算法练习题,算法题集)