每日一题 | 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(计算日期到天数转换 | 幸运的袋子)的主要内容,如果未能解决你的问题,请参考以下文章