HDOJ 1201 18 번 째 생일

4726 단어 chdoj
18 살 생일
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23040    Accepted Submission(s): 7351
Problem Description
Gardon 의 18 번 째 생일 이 곧 다가 오 는데,그 는 당연히 매우 기 뻤 다.그러나 그 는 갑자기 한 가지 문제 가 생각 났 다.모든 사람 이 태 어 날 때 부터 18 번 째 생일 에 이 르 렀 을 때 지나 간 일수 가 똑 같 지 않 을 까?모두 그런 것 만 은 아 닌 것 같 아서 그 는 그 와 그의 친구 몇 명 이 태 어 나 18 번 째 생일 까지 거 친 총 일 수 를 계산 해 비교 해 달라 고 부탁 하고 싶 었 다.
 
Input
하나의 숫자 T,뒤의 T 줄 은 줄 마다 날짜 가 있 고 형식 은 YYYY-MM-DD 입 니 다.내 생일 이 1988-03-07 이 라면.
 
Output
T 행 은 줄 마다 한 번 씩 이 사람 이 태 어 나 18 번 째 생일 까지 거 친 날 수 를 나타 낸다.이 사람 이 18 번 째 생일 이 없다 면 수출-1.
 
Sample Input

   
   
   
   
1 1988-03-07

 
Sample Output

   
   
   
   
6574

 
Author
Gardon
 
Source
Gardon-DYGG Contest 2
 
Recommend
JGShining   |   We have carefully selected several similar problems for you:   1205  1215  1228  1235  1202
주의 하 다.   if(yun(a)&&b==2&&c==29)   return -1;
 #include<stdio.h>
#include<string.h>
struct birth{
    int year,mon,day;
}bir[200];
int yun(int a){
    if(a%400==0||(a%100!=0&&a%4==0))
    return 1;
    else return 0;
}
int dday(int a,int b,int c){
    int sum=0,i,starsum=0,endsum=0;
    if(yun(a)&&b==2&&c==29) return -1;
    for(i=(a+1);i<=(a+17);i++){
        if(yun(i)) sum+=366;
        else sum+=365;
    }
    if(yun(a)){
        switch(b){
            case 1: starsum+=31;
            case 2: starsum+=29;
            case 3: starsum+=31;
            case 4: starsum+=30;
            case 5: starsum+=31;
            case 6: starsum+=30;
            case 7: starsum+=31;
            case 8: starsum+=31;
            case 9: starsum+=30;
            case 10: starsum+=31;
            case 11: starsum+=30;
            case 12: starsum+=31; break;
        }
        starsum-=c;
    }
    else{
        switch(b){
            case 1: starsum+=31;
            case 2: starsum+=28;
            case 3: starsum+=31;
            case 4: starsum+=30;
            case 5: starsum+=31;
            case 6: starsum+=30;
            case 7: starsum+=31;
            case 8: starsum+=31;
            case 9: starsum+=30;
            case 10: starsum+=31;
            case 11: starsum+=30;
            case 12: starsum+=31; break;
        }
        starsum-=c;
    }
    if(yun(a+18)){
        switch(b){
            case 1: endsum+=31;
            case 2: endsum+=29;
            case 3: endsum+=31;
            case 4: endsum+=30;
            case 5: endsum+=31;
            case 6: endsum+=30;
            case 7: endsum+=31;
            case 8: endsum+=31;
            case 9: endsum+=30;
            case 10: endsum+=31;
            case 11: endsum+=30;
            case 12: endsum+=31; break;
        }
        endsum=(366-endsum+c);
    }
    else {
        switch(b){
            case 1: endsum+=31;
            case 2: endsum+=28;
            case 3: endsum+=31;
            case 4: endsum+=30;
            case 5: endsum+=31;
            case 6: endsum+=30;
            case 7: endsum+=31;
            case 8: endsum+=31;
            case 9: endsum+=30;
            case 10: endsum+=31;
            case 11: endsum+=30;
            case 12: endsum+=31; break;
        }
        endsum=(365-endsum+c);
    }
    sum+=(starsum+endsum);
    return sum;
}
int main(){
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        memset(bir,0,sizeof(bir));
        scanf("%d-%d-%d",&bir[i].year,&bir[i].mon,&bir[i].day);
        printf("%d
",dday(bir[i].year,bir[i].mon,bir[i].day)); } return 0; }

소인 코드(계산 18 년 매년 365 일 이상,게다가):
<span style="color:#000000;">#include "stdio.h"
int main()
{int n,i,y,m,d,sum,x; 
	scanf("%d",&n);
	while(n--)
	{   sum=0;//18    365   
		scanf("%d-%d-%d",&y,&m,&d);
		if(m==2&&d==29)
		{
			printf("-1
"); continue; } if((y%4==0&&y%100!=0||y%400==0)&&m<3) sum++; x=y+18; if((x%4==0&&x%100!=0||x%400==0)&&m>=3) sum++; for(i=y+1;i<y+18;i++) if(i%4==0&&i%100!=0||i%400==0) sum++; printf("%d
",365*18+sum); } return 0; }</span>

좋은 웹페이지 즐겨찾기