一个人出生日期不同,就会处于不同的星座,星座与出生日期之间的对应关系如下:
白羊座:3月21日——4月19日
金牛座:4月20日——5月20日
双子座:5月21日——6月21日
巨蟹座:6月22日——7月22日
狮子座:7月23日——8月22日
处女座:8月23日——9月22日
天秤座:9月23日——10月23日
天蝎座:10月24日——11月22日
射手座:11月23日——12月21日
摩羯座:12月22日——1月19日
水瓶座:1月20日——2月18日
双鱼座:2月19日——3月20日
Input
第一行是一个正整数n,表示后续有n行数据。后面的n行中,每一行都有三个整数,中间用一个空格分开,表示一个人的出生日期,三个部分分别是出生日期的年、月、日。
Output
每个日期所属的星座,如果日期是不合法的,则输出雅典娜。
Sample Input
4
1976 11 26
1978 10 3
1979 3 14
1980 4 31
Sample Output
射手座
天秤座
双鱼座
雅典娜
供参考
#include <stdio.h>
typedef struct
{
int year, month, day;
} DATE;
typedef struct
{
char name[10];
int sM;
int sD;
int eM;
int eD;
} STARTS;
STARTS starts[] = {{""}, {"水瓶座", 1, 20, 2, 18}, {"双鱼座", 2, 19, 3, 20}, {"白羊座", 3, 21, 4, 19}, {"金牛座", 4, 20, 5, 20}, {"双子座", 5, 21, 6, 21}, {"巨蟹座", 6, 22, 7, 22}, {"狮子座", 7, 23, 8, 22}, {"处女座", 8, 23, 9, 22}, {"天秤座", 9, 23, 10, 23}, {"天蝎座", 10, 24, 11, 22}, {"射手座", 11, 23, 12, 21}, {"摩羯座", 12, 22, 1, 19}};
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int Err(int y, int m, int d)
{
int err = 0;
int leap = (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0));
if (y < 1 || m > 12 || m < 1 || d < 1)
err = 1;
if (m != 2 && d > month[m])
err = 1;
if (m == 2)
{
if (leap && d > month[m] + 1)
err = 1;
if (!leap && d > month[m])
err = 1;
}
return err;
}
void con(DATE date)
{
int m = date.month;
if (date.day < starts[m].sD)
{
if (m == 1)
m = 12;
else
m--;
}
printf("%s\n", starts[m].name);
}
int main()
{
int n;
scanf("%d", &n);
DATE *date = (DATE *)malloc(n * sizeof(DATE));
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &date[i].year, &date[i].month, &date[i].day);
}
for (int i = 0; i < n; i++)
{
if (Err(date[i].year, date[i].month, date[i].day))
{
printf("雅典娜\n");
continue;
}
con(date[i]);
}
system("pause");
return 0;
}
感觉用swith-case比较简单:
#include <stdio.h>
char* star(int y,int m,int d)
{
int s, leap = (m==2)*((y%4==0 && y%100!=0) || y%400==0);
int month[13] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
s = (y<1||m<1||d<1||m>12||d>month[m-1]+leap)?0:m*100 + d;
switch(s){
case 321 ... 419:return (char*)"白羊座";
case 420 ... 520:return (char*)"金牛座";
case 521 ... 621:return (char*)"双子座";
case 622 ... 722:return (char*)"巨蟹座";
case 723 ... 822:return (char*)"狮子座";
case 823 ... 922:return (char*)"处女座";
case 923 ... 1023:return (char*)"天秤座";
case 1024 ...1122:return (char*)"天蝎座";
case 1123 ...1221:return (char*)"射手座";
case 1222 ...1231:
case 101 ... 119:return (char*)"摩羯座";
case 120 ... 218:return (char*)"水瓶座";
case 219 ... 320:return (char*)"双鱼座";
default:
return (char*)"雅典娜";
}
}
int main()
{
int n;
scanf("%d", &n);
int date[n][3];
for (int i = 0; i < n; i++){
scanf("%d%d%d", &date[i][0], &date[i][1], &date[i][2]);
}
for (int i = 0; i < n; i++){
printf("%s\n",star(date[i][0],date[i][1],date[i][2]));
}
return 0;
}