1.日期统计
分析:100个数字可以存在一个静态数组中,对于统计的日期,另外再用一个数组存储。而不知道具体数组的大小,就没办法初始化,所以使用一个动态数组存储,比如STL库中的set容器,因为题目要求相同的日期只需要统计一次,set容器的特点就是可以避免相同的键值,使用这个容器的优势还在于方便的进行数据的插入和长度的计算,可以很好的用来解题。再者它是一个八位日期的数字,前四位相同,所以只需要存储后四位数字即可,利用八重循环,找出合法日期。注意在月份和天数处理时,判断其合法性,由于2023不能被4整除也不能被100整除,所以是平年。2月只有28天,以月份作为天数的判断条件。对于月份或者天数的长度只有一位时,题目要求补充前导零。可以这么来处理,把它当作一个四位数来看。月份的前导零可以不用添加,当月份只有一位数时乘以100直接加上天数,这样天数只有一位时,前导零便有了。
源代码:
#include <bits/stdc++.h>
using namespace std;
int num[110];
int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int main() {
for (int i=0;i<100;i++) cin >>num[i]; //输入100个数
set<int> ans;
for (int i = 0; i < 100; i++)
for (int j = i + 1; j < 100; j++)
for (int k = j + 1; k < 100; k++)
for (int v = k + 1; v < 100; v++) //前4个数字构成年
{
int y = num[i] * 1000 + num[j] * 100 + num[k] * 10 + num[v]; //年
if (y == 2023) { //找到了年,再找月、日
for (int m = v + 1; m < 100; m++)
for (int n = m + 1; n < 100; n++)
for (int o = n + 1; o < 100; o++)
for (int p = o + 1; p < 100; p++)
{
int mon = num[m] * 10 + num[n]; //月
int d = num[o] * 10 + num[p]; //日
if ((mon >= 1 && mon <= 12) && (d >= 1 && d <= days[mon]))
{
int temp = mon * 100 + d;
ans.insert(temp); //用set去重
}
}
break;
}
}
cout << ans.size();
return 0;
}
2.01串的熵
分析:这个题目也是纯暴力,可以通过枚举解题。假如有x个1,那么就有23333333-x个0,直接根据公式计算信息熵,写一个函数,因为c++有log2()函数,所以可以直接拿来用。把计算出来的信息熵与题目给的数字求差的绝对值,精度精确到1e-4方即可。因为题目要求0的次数比1少,所以对于输出的两个数中,取较小的数。
源代码:
#include<bits/stdc++.h>
using namespace std;
double hs(int a,int b){
double x1=1.0*a/(a+b);
double x2=1.0*b/(a+b);
double ans=-a*x1*log2(x1)-b*x2*log2(x2);
return ans;
}
int main(){
for(int i=0;i<=23333333;i++){
if(fabs(hs(i,23333333-i)-11625907.5798)<0.0001){
cout<<i<<endl;
break;
}
}
return 0;
}