1.打印日期
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
#include <stdio.h>
#include <stdbool.h>
bool isrun(int y){ //判断是否是闰年
if(y%400==0||(y%4==0&&y%100!=0)){
return true;
}
return false;
}
int main() {
int y,d;
scanf("%d %d",&y,&d);
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isrun(y)){
arr[2]=29;
}
int i = 1;
while(d>arr[i]){
d = d-arr[i];
i++;
}
printf("%04d-%02d-%02d",y,i,d);
return 0;
}
%d左对齐,输出变量的所有数字;%4d右对齐,宽度为4,左边填充空格,当变量的实际宽度大于4时,输出变量的所有数字;%04d与%4d的唯一区别就是左边填充0。
以%d,%4d,%04d,输出12时,结果是:
12
两个空格12
0012
2.日期累加
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:
输出m行,每行按yyyy-mm-dd的个数输出。
#include <stdio.h>
#include <stdbool.h>
bool isrun(int y){
if(y%400==0||(y%4==0&&y%100!=0)) return true;
return false;
}
int main() {
int n,y,m,d,num;
int f=365; // 一年天数
scanf("%d",&n);
while(n--){
scanf("%d %d %d %d",&y,&m,&d,&num);
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isrun(y)){
arr[2]=29;
f=366;
}
// 判断原始日期为哪一天
int old_day=0;
for(int j=1;j<m;j++){
old_day+=arr[j];
}
old_day+=d;
int new_day=0;
new_day = old_day + num;
int i=1;
if(new_day<=f){ // 没超过一年
while(new_day>arr[i]){
new_day-=arr[i];
i++;
}
}else{
y++; //新的一年
new_day-=f; // 减去去年的天数
if(isrun(y)){
arr[2]=29;
f=366;
} else{
arr[2]=28;
f=365;
}
while(new_day>arr[i]){
new_day-=arr[i];
i++;
}
}
printf("%04d-%02d-%02d\n",y,i,new_day);
}
return 0;
}
基本思路
原来日期是一年中的具体天数,再加上天数等于新的具体天数,在此过程中要注意判断闰年,以及跨年考虑新的一年是否是闰年
3.剩下的树
有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,…,L共L+1个位置上有L+1棵树。 现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。 可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
输入描述:
两个整数L(1<=L<=10000)和M(1<=M<=100)。 接下来有M组整数,每组有一对数字。
输出描述:
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。
#include <stdio.h>
int main() {
int L,M;
scanf("%d %d",&L,&M);
// 种树
int tree[10001];
for(int i=0;i<=L;i++){
tree[i]=1;
}
// 挖树
for(int j=0;j<M;j++){
// 左右区间
int l,r;
scanf("%d %d",&l,&r);
for(int k=l;k<=r;k++){
tree[k]=0;
}
}
// 数树
int num=0;
for(int i=0;i<=L;i++){
if(tree[i]==1) num++;
}
printf("%d",num);
return 0;
}