日期统计
第一遍写的时候会错了题目的意思,我以为是一定要八个整数连在一起构成正确日期,后面发现逻辑明明没有问题但是答案怎么都是错的才发现理解错了题目的意思,题目的意思是按下标顺序组成,意思就是可以不连续,我还是把它想得太简单啦
这是一段判断连续下标可以组成日期的代码,我利用了一个数组判断该日期是否在前面出现过
#include<stdio.h>
int main(){
int count[10000]={0};//方便判断日期是否出现过
int charge[13];//判断月份对应的日期是否合法
int shuzu[100];
int i,year,day,month,t=0;
for(i=0 ; i<100 ; i++)
{
scanf("%d",&shuzu[i]);//输入数组
}
for(i=1 ; i<=12 ; i++){//初始化charge
if(i==2){
charge[i]=28;
}
else if(i==4 || i==6 || i==9 || i==11 ){
charge[i]=30;
}
else{
charge[i]=31;
}
}
for(i=0 ; i<92 ;i++){
year=shuzu[i]*1000+shuzu[i+1]*100+shuzu[i+2]*10+shuzu[i+3];
month=shuzu[i+4]*10+shuzu[i+5];
day=shuzu[i+6]*10+shuzu[i+7];
if(year==2023){
if(0<month && month<=12){
if(day>0 && day<=charge[month]){
if(count[month*100+day]==0){
t++;
count[month*100+day]=1;
}
}
}
}
}
printf("%d",t);
return 0;
}
这是正确的代码,逐个遍历2023年的每一天,并查找给出数组是否有相同
#include <stdio.h>
int main() {
int array[100] = {
5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,
5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,
2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3,
8, 5, 1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6,
1, 4, 0, 1, 0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3
};
int daysInMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int ans = 0;
int month,day,i;
for ( month = 1; month <= 12; ++month) {
for ( day = 1; day <= daysInMonth[month]; ++day) {
int dateSeq[8] = {2, 0, 2, 3, month / 10, month % 10, day / 10, day % 10};
int k = 0;
for ( i = 0; i < 100; ++i) {
if (array[i] == dateSeq[k]) {
++k;
if (k == 8) {
ans++;
break;
}
}
}
}
}
printf("%d\n", ans);
return 0;
}
01串的熵
不要被题目吓到啦,暴力遍历就好,我一开始混用了double与int,结果发现i不能是float,只能是int,因为后面要输出(又是被小错误绊倒)
#include <stdio.h>
#include <math.h>
int main()
{
double max=23333333,Sum;
int i;
for(i=0 ; i<=max/2 ;i++){
Sum=0;
Sum-=i*(i/max)*log2(i/max)+(max-i)*((max-i)/max)*log2((max-i)/max);
if(Sum > 11625907.5 && Sum < 11625907.6){
printf("%d",i);
break;
}
}
return 0;
}
冶练金属
一遍过
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,j;
scanf("%d",&n);
int a[n],b[n];//用两个数组分别储存输入
int min[n],max[n],n_min,n_max;
for(i=0;i<n;i++){
scanf("%d %d",&a[i],&b[i]);
max[i]=a[i]/b[i];//获取单个最大V
min[i]=max[i];
while(a[i]/min[i]==b[i]){
min[i]--;
}//获取单个最小V
min[i]++;//循环出来的是不满足题意的,所以加一
}
n_min=1000000;//在所有最大的里面找最小的才能满足所有
for(i=0;i<n;i++){
if(max[i]<n_min)
{
n_min=max[i];
}
}
n_max=0;//在所有最小的里面找最大的
for(i=0;i<n;i++){
if(min[i]>n_max)
{
n_max=min[i];
}
}
printf("%d %d",n_max,n_min);//注意输出顺序
return 0;
}