c++关于模拟题你了解多少

1.模拟题一般是一类头疼的问题,有时候一些错误更是让我们红橙作伴,潇潇洒洒的交一发wa一发
2.有些模拟题很简单,看一下按照题目的意思模拟一遍就可以了,只需要注意一些细节就好,还有些模拟题虽然看起来简单但却无从下手


下面这个几个模拟题对于蒟蒻的我来说是很好的学习例题
不为什么就想记录一下自己学习的过程,把自己如何思考,如何学习,如何解决一一说清楚,希望你们也能从中受益~

wjw的星期五

题目描述
wjw最近运气极其差,什么roll点1-100连着十次都是个位数啊,买个珍珠奶茶没有珍珠啊,吃方便面没有调料包啊…
迷信的wjw觉得,一定是因为这个月的13号正好是星期五,才会导致他的运气这么差。
现在他想知道,在某个年份中,有多少个月的13号是星期五,这样他才可以提前做好心理准备。
PS.已知1998年1月1日是星期四,输入的年份肯定大于或等于1998年。

输入
input
输入只有一行,表示年份(大于等于1998年)

输出
output
输出只有一行,表示这一年中有多少个月的13号是星期五

样例输入
1998
样例输出
3
提示
说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;

PS:
这种题目第二次遇见,遇见的时候我想起了第一次那种手无足措的感觉,虽然事后看了大佬的题解,但却用了很长时间来消化,所以我觉得有必要来记录自己学习的过程,虽然艰辛,但是得到AC的那一刻,内心是喜悦的,谁不是一直在追求AC的路上呢?
分析题目
题目是想找出一年中有多少个月份的13号是星期五,很显然这是一道模拟题

  1. 首先我们要定义两个数组,分别储存平年以及闰年1–12月份的天数
  2. 其次需要用一个函数判断是否是闰年,这样会方便许多
  3. 题目已知最初条件“已知1998年1月1日是星期四”,小小的推理一遍,我们就知道1998年1月9号是星期五(别问我是怎么知道的,就是知道 强势)这样我们只需找到每月13号减去最初的1月9号是所剩下的否是7的倍数,如果是,就让ans++,这样题目就清晰了许多。

AC代码

#include 
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e6 + 5;
int a[13] = {
     0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int b[13] = {
     0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char c[maxn];
int judge(int y)
{
     
    if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        return 1;
    return 0;
}
int main()
{
     
    int y, ans, num;
    while (~scanf("%d", &y))
    {
     
        int num = 4, ans = 0; //num是最初13号与9号相差的天数
        for (int i = 1998; i < y; ++i)
        {
     
            num += 365;
            if (judge(i)) //如果是闰年就是366天
                ++num;
        }
        if (judge(y))
        {
     
            for (int i = 1; i <= 12; ++i)
            {
     
                if (num % 7 == 0) //找到了就加一
                    ++ans;
                num += b[i]; //继续下一个操作
            }
        }
        else
        {
     
            for (int i = 1; i <= 12; ++i)
            {
     
                if (num % 7 == 0)
                    ++ans;
                num += a[i];
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}


下面这个题目就稍显麻烦一些,不过大致思路还是一样的,如果会了上面那个,下面这个稍微难一点的就迎刃而解了(●′ω`●)

爱的日期

题目描述
Inter和AMD刚刚在上个学期确定了恋爱关系,但是由于要期末考试,他们没法have a appointment。
所以他们打算在2月14日情人节那天一起出去。恰恰最近疫情爆发,Inter和AMD都被关在机箱里面不准出来。
于是Inter就想找一个普通而又特殊的日子再次和AMD约会。 要是个周五,然后这个周五是当月的20号岂不美哉?
你能帮帮Inter找出当年中既是周5,又是20号的月份吗。(找不到Inter就只能伤心的回去挤牙膏了)

输入
输入包含多组数据,每组数据包含一个正整数year(2000≤year≤9999)。
输出
对应每一组数据,输出所有符合条件的月份,月份之间用空格隔开。
如果当年不存在20号是星期五的月份,就输出一行jiyagao。
样例输入
2000
2001
2002
样例输出
10
4 7
9 12

PS : 不一样的是这里需要输出是哪几个月份,而不是有几个月份,代码大同小异

#include 
using namespace std;
int a[13] = {
     0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int b[13] = {
     0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int judge(int y)
{
     
    if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        return 1;
    return 0;
}
int main()
{
     
    int y, ans, num, s[13];
    while (cin >> y)
    {
     
        num = 6, ans = 0;
        for (int i = 2000; i < y; ++i)
        {
     
            num += 365;
            if (judge(i))
                ++num;
        }
        if (judge(y))
        {
     
            for (int i = 1; i <= 12; ++i)
            {
     
                if (num % 7 == 0)
                    s[++ans] = i;
                num += b[i];
            }
        }
        else
        {
     
            for (int i = 1; i <= 12; ++i)
            {
     
                if (num % 7 == 0)
                    s[++ans] = i;
                num += a[i];
            }
        }
        if (ans)
        {
     
            for (int i = 1; i < ans; ++i)
                cout << s[i] << ' ';
            cout << s[ans] << endl;
        }
        else
            cout << "jiyagao" << endl;
    }
    return 0;
}
诗读百遍,其义自见。“行到水穷处,坐看云起时” 送给此刻面对人生困境和艰难的你我他

你可能感兴趣的:(模拟)