每日一题 | day14(计算日期到天数转换 | 幸运的袋子)

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day14(计算日期到天数转换 | 幸运的袋子)相关的知识,希望对你有一定的参考价值。

选择

1、定义char dog[]=“wang\\0miao”;那么sizeof(dog)与strlen(dog)分别是多少:
A 10,4
B 4,4
C 9,9
D 9,4
正确答案 A:sizeof求的是字符串的大小,有多少个字符就大小就有多大,strlen求的是字符串实际长度,遇到\\0结束

2、假设寄存器为8位,用补码形式存储机器数,包括一位符号位,那么十进制数-25在寄存器表示为:
A 67H
B 99H
C E6H
D E7H
正确答案 D:十进制数-25的原码为10011001,反码为11100110,补码是反码加1,即为11100111,转化为十六进制即为E7

3、下面代码的执行结果是什么:

char ccString1[]="Is Page Fault??";
char ccString2[]="No Page Fault??";
strcpy(ccString1,"No");
if(strcmp(ccString1,ccString2)==0)
cout<<ccString2;
else
cout<<ccString1;

A No
B No Page Fault??
C Is Page Fault??
D 其他三项都错
正确答案 A:strcpy拷贝是覆盖拷贝,也会将src的\\0拷贝过去,所以src为什么,dest就为什么

3、有一个类B继承自类A,他们数据成员如下:

class A {
...
private:
	int a;
};
class B : public A {
...
private:
	int a;
public:
	const int b;
	A &c;
	static const char* d;
	B* e;
}

则构造函数中,成员变量一定要通过初始化列表来初始化的是____。
A a b c
B b c e
C b c d e
D c e
E b d
F b c
正确答案 F:必须要在初始化列表初始化的成员变量有const、引用,还有没有默认构成函数的自定义成员变量

编程题

题目1
在这里插入图片描述
思路
定义一个函数,用于日期到天数的转换,日期到天数的转换,我们举例子,例如求2021年12月的31号,则最后的天数为前11个月的天数加上当前号的天数。所以我们需要再定义一个函数用于获取当前月有多少天,在这个函数中,由于天数都是写死的,我们可以定义一个数组来保存某月的天数。除了2月需要判断是否为闰年,天数是否需要加1。代码简单,如下
代码

#include<iostream>
using namespace std;

//判断是否为闰年
bool isLeap(int& year)
{
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

//获取每个月有多少天
int getDaysByYM(int& year, int& month)
{
    static int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int day = days[month];
    if (month == 2)
    {
        if (isLeap(year))
            day++;
    }
    return day;
}

//获取天数
int getDaysByYMD(int& year, int& month, int& day)
{
    int days = 0;
    for (int i = 1; i < month; ++i)
    {
        days += getDaysByYM(year, i);
    }
    days += day;
    return days;
}

int main()
{
    int year, month, day;
    int days = 0;
    while ((cin >> year >> month >> day))
    {
        days = getDaysByYMD(year, month, day);
        cout << days << endl;
    }
    return 0;
}

题目2
在这里插入图片描述
思路:回溯

定义一个函数,用于递归回溯算法。参数有,一开始输入的袋子x,袋子中球的个数n,从第几个位置开始pos, 相加的结果sum,相乘的记过multi。在这函数中,从pos位置开始循环,先让sum加上x[i],让multi乘上x[i]。然后去判断是否满足,满足的话计数器+1并在这条路径上去查找。如果不满足但是当前位置是1,有可能下一个位置还是1,所以就继续遍历这条路径。如果不满足当前位置也不是1,表示下面的路径都不能走了。直接跳出循环。直到一条路径走完后,就回溯到上一各节点,判断另一条路径之前需要去重,存在相同的结点就不遍历直接跳过。

我们一开始可以先将数组排序,成为升序。这样子有便于路径的查找与剪纸
在这里插入图片描述

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int getLuckPacket(vector<int>& x, int n, int pos, int sum, int multi)
{
    int count = 0;
    for (int i = pos; i < n; ++i)
    {
        sum += x[i];
        multi *= x[i];
        //判断是否幸运
        if (sum > multi)
        {
        	//幸运+1
            count += 1 + getLuckPacket(x, n, i + 1, sum, multi);
        }
        else if (x[i] == 1)
            count += getLuckPacket(x, n, i + 1, sum, multi);
        else
            break;
        //回溯
        sum -= x[i];
        multi /= x[i];
        
        //去重
        while (i < n - 1 && x[i] == x[i + 1])
            ++i;
    }
    return count;
}

int main()
{
    int n;
    while (cin >> n)
    {
        vector<int> vec(n);
        for (int i = 0; i < n; ++i)
            cin >> vec[i];
        sort(vec.begin(), vec.end());
        cout << getLuckPacket(vec, n, 0, 0, 1) << endl;
    }
    return 0;
}

以上是关于每日一题 | day14(计算日期到天数转换 | 幸运的袋子)的主要内容,如果未能解决你的问题,请参考以下文章

算法·每日一题(详解+多解)-- day14

算法·每日一题(详解+多解)-- day14

每日一题 | day16(iNOC产品部-完全数计算 | 扑克牌大小)

新手求教Java时间转换问题(增加天数后的日期输出)

mysql如何计算每个月第一天到当前日期的天数?

excel表格日期计算天数