一、日期计算
1、闰年的计算(平2月28,闰2月29)
if(y%4000||(y%40&&y%100!=0)) 为闰年
2、日期的存储
存储在1~12的数组中,为闰年时month[2]+=1
3、循环内逐个减去month[i]至d小于等于0,即
int I=1;
while(d>0){d-=month[I];++I;
}
则I-1为当前月份,d+month[I-1]为当前月的第几天
#include <iostream>
using namespace std;
int main(){int y,d;cin>>y>>d;int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};if((y%400==0)||(y%4==0&&y%100!=0))month[2]+=1;int i=1;while(d>0){d-=month[i];++i;}cout<<(i-1)<<endl<<d+month[i-1];return 0;
}
由于每月天数没有循环性,因此不能取模
二、消除类游戏
大致思路为 相同的数记作其相反数,则小于0的元素最后以0形式输出
#include <iostream>
#include <cmath>
using namespace std;
int a[35][35],b[35][35]={0};
int main(){int n,m,count=0;cin>>n>>m;for(int i=0;i<n;++i)for(int j=0;j<m;++j)cin>>a[i][j];for(int i=0;i<n;++i){for(int j=0;j<m-2;++j){if(abs(a[i][j])==abs(a[i][j+1])&&abs(a[i][j+1])==abs(a[i][j+2])){if(a[i][j]>0)a[i][j]*=-1;if(a[i][j+1]>0)a[i][j+1]*=-1;if(a[i][j+2]>0)a[i][j+2]*=-1;}}}for(int j=0;j<m;++j){for(int i=0;i<n-2;++i){if(abs(a[i][j])==abs(a[i+1][j])&&abs(a[i+1][j])==abs(a[i+2][j])){if(a[i][j]>0)a[i][j]*=-1;if(a[i+1][j]>0)a[i+1][j]*=-1;if(a[i+2][j]>0)a[i+2][j]*=-1;}}}for(int i=0;i<n;++i){for(int j=0;j<m;++j){if(a[i][j]<0)a[i][j]=0;cout<<a[i][j]<<" ";}cout<<endl;}return 0;
}
具体思路:
由于1)需要三个及以上连续元素才能消除,2)判断完横向并取符合题意的元素的相反数后,竖向也要进行判断,因此应判断相邻的三个元素绝对值是否相同
注意,已经取相反数的元素不再进行乘-1的运算