第几天?
Problem Description
给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。
Sample Input
1985/1/20
2006/3/12
Sample Output
20
71
这道题一开始就发现有一个小坑:闰年二月是不一样的,一开始直线思维的我用的是特别直线的方法:
#include<iostream>
#include<cstdio>
using namespace std;
bool ifrun(int yy){
if((yy%4==0&&yy%100!=0)||(yy%400==0)){
return true;
}else
return false;
}
int main(){
int y,m,d;
char c='/';
while(scanf("%d/%d/%d",&y,&m,&d)!=EOF){
if(m<0||m>12||d<0||d>32){
break;
}
int count;
int m1,d1;
d1=1;m1=1;
for(m1=1;m1<=m;m1++){
if(m1==2||m1==4||m1==6||m1==8||m1==9||m1==11){
count+=31;
continue;
}
if((m1==3)&&ifrun(y)){
count+=29;
continue;
}
if((m1==3)&&(!ifrun(y))){
count+=28;
continue;
}
if((m1==5||m1==7||m1==10||m1==12)){
count+=30;
continue;
}
}
count+=d;
cout<<count<<endl;
count=0;
}
return 0;
}
注意
-
因为count定义在while里面了,所以为了防止一次次的叠加,要输出之后赋值0,或者将count定义写在while外面。
-
之前一直和我说WA,改了好久都不知道错在哪里,后来突发奇想改成G++提交就过了。emmmmmm原来一直是c++。
查了一下,提交C语言代码最好使用G++,G++兼容C和C++。C的代码可以用GCC也可用G++提交,而C++的代码不能够用GCC提交,只能用G++。因此最好一个通过不了的两个都试试,编译器的问题有的时候不好找(尤其是遇到long long 类型的和double的输入输出的时候) 所以下次再无缘无故WA就先两个都试试
补充:
如何避免由于编译器差别带来的错误
1、判题系统使用的是G++编译器,和普通使用的TC,VC都有所不同,建议大家使用Dev C++作为IDE,或者用TC和VC写代码,提交前使用Dev C++编译,预防编译错误。
2、G++包含库的时候不要使用iostream.h,应该使用
有些常用的函数所在的库会被VC自动包含,但是不会被G++包含。
例如memset,strlen,strstr等和字符串处理相关的函数在库中;abs在中;fabs,sin,sqrt等数学函数在中
为了避免CE,大家可以索性一次性把所有可能用到的库都给包含上。
C++注意要使用using namespace std;
3、关于整数,在G++下,long和int是完全一样的
4、浮点数:使用double以减小误差,格式控制字符串是"%lf"(不要使用float)。浮点数的相等不能直接用==来判断,需要使用实数判等。
5、标识符,G++中有一些在VC中没有的保留字,比如and,or,not等等,使用这些保留字作为标识符会产生CE。
6、对于输入输出,建议不要使用cin和cout,这种输入输出方式会比较慢,在数据量大的时候容易引起超时。
7、关于main函数,定义一定要是int型,并记得加上return 0。
int main(){… return 0; }
8、当使用类似于for (int i=0;i<n;i++)这种形式对循环变量进行定义时,注意循环变量的作用域只在这个循环内。
9、输入法在敲代码和提交代码的时候一定要确保关闭,代码中(除了注释部分)有全角字符会引起CE,注释建议使用英文。
10、使用STL的同学请注意例如下面的声明是会引起CE的
vector<vector> adj; 应该改为 vector<vector > adj;
连续两个左右箭头间要一个空格。
上网看到了更简洁的版本,贴上来:
#include<stdio.h>
int main() {
int day[12] = {31,0,31,30,31,30,31,31,30,31,30,31}; //每个月份各有多少天。由于2月不确定,所以暂且设为0
int year, month, date;
int total = 0; //天数
while(scanf("%d/%d/%d", &year, &month, &date) != EOF) {
if((year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0))) { //判断输入年份是否是闰年,然后设置二月天数
day[1] = 29;
} else {
day[1] = 28;
}
int i = 0; //月份计数
while(i < month - 1) {
total += day[i];
i++;
}
total += date;
printf("%d\n",total);
total = 0;
}
return 0;
}