2.星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。 有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19 请严格按照格式书写。不能出现其它文字或符号。
Code:
#include <stdio.h>
int main(){
int rm[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年 注意:数组下标从0开始,而要用的是从1开始之后的12个
int pm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年
int y,m,d,restday=0,i,r,qx,t; //restday:计算天数,和期限比较控制循环 //r为1是闰年//t:计数//qx:你定的期限
t=0;
printf("请输入起始年份\n");
scanf("%d",&y);
printf("请输入起始月份\n");
scanf("%d",&m);
printf("请输入起始日期\n");
scanf("%d",&d);
printf("请输入定时\n");
scanf("%d",&qx);
i=m; //注意i的初始化 ,例如输入2013 1 1 1 输出2013-1-2,若赋值为0或者其他值,则输出月份时会出现错误
restday+=rm[m]-d; //当月剩余天数,这个比较特殊,所以拿出来单独算
while(restday<qx){
if(t>0) d=0;//day是需要清0的,因为后面还要减去d,但注意第一年day不清0
if(y%400==0||(y%4==0&&y%100!=0)) //今年是闰年//判断:年份能被400整除或者不能被100整除但能被4整除的
{
r=1;
for(i=m+1;i<=12;i++)//i:0-12
{if(restday>=qx) break;restday+=rm[i];if(restday>=qx) break;}//把今年剩下的日子统计
}
else{//今年是平年
r=0;
for(i=m+1;i<=12;i++)
{if(restday>=qx) break;restday+=pm[i];if(restday>=qx) break;}//把今年剩下的日子统计 用i记录月份
}
if(i>12)
{
y++;//年份+1,循环继续
t++;
}
m=0;//月份从一开始,但是注意上述for循环中i=m+1,所以此处的m=0
}//while
restday=restday-qx;
if(restday==0){
if(i==2)//在2月
if(r==1) d=rm[i];//run
else d=pm[i];//ping
else d=pm[i];//不在2月
}
else{//restday!=0
if(i==2)//在2月
if(r==1) d=rm[i]-restday;//run
else d=pm[i]-restday;//ping
else d=pm[i]-restday;//不在2月
}
printf("%d",y);
if(i<10) printf("-0%d",i);
else printf("-%d",i);
if(d<10) printf("-0%d\n",d);
else printf("-%d\n",d);
return 0;
}
TestResult:
健壮1:考虑了不正常的数值情况,但没有考虑其他字符,比如:”‘【】、、?”等符号.
Code:#include <stdio.h>
int main(){
int rm[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年 注意:数组下标从0开始,而要用的是从1开始之后的12个
int pm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年
int y,m,d,restday=0,i,r,qx,t; //restday:计算天数,和期限比较控制循环 //r为1是闰年//t:计数//qx:你定的期限
t=0;
printf("请输入起始年份,退出请输入-1\n");
scanf("%d",&y);
if(y==-1) return 0;
while(y<1000||y>9999){
printf("年份输入格式有误,请重新输入!退出请输入-1\n");
scanf("%d",&y);
if(y==-1) return 0;
}
printf("请输入起始月份,退出请输入-1\n");
scanf("%d",&m);
if(m==-1) return 0;
while(m<1||m>12){
printf("月份输入格式有误,请重新输入!退出请输入-1\n");
scanf("%d",&m);
if(m==-1) return 0;
}
printf("请输入起始日期,退出请输入-1\n");
scanf("%d",&d);
if(d==-1) return 0;
while(d<1||d>31){
printf("日期输入格式有误,请重新输入!退出请输入-1\n");
scanf("%d",&d);
if(d==-1) return 0;
}
printf("请输入定时长,退出请输入-1\n");
scanf("%d",&qx);
if(qx==-1) return 0;
while(qx<0){
printf("时长输入格式有误,请重新输入!退出请输入-1\n");
scanf("%d",&qx);
if(qx==-1) return 0;
}
i=m; //注意i的初始化 ,例如输入2013 1 1 1 输出2013-1-2,若赋值为0或者其他值,则输出月份时会出现错误
restday+=rm[m]-d; //当月剩余天数,这个比较特殊,所以拿出来单独算
while(restday<qx){
if(t>0) d=0;//day是需要清0的,因为后面还要减去d,但注意第一年day不清0
if(y%400==0||(y%4==0&&y%100!=0)) //今年是闰年//判断:年份能被400整除或者不能被100整除但能被4整除的
{
r=1;
for(i=m+1;i<=12;i++)//i:0-12
{if(restday>=qx) break;restday+=rm[i];if(restday>=qx) break;}//把今年剩下的日子统计
}
else{//今年是平年
r=0;
for(i=m+1;i<=12;i++)
{if(restday>=qx) break;restday+=pm[i];if(restday>=qx) break;}//把今年剩下的日子统计 用i记录月份
}
if(i>12)
{
y++;//年份+1,循环继续
t++;
}
m=0;//月份从一开始,但是注意上述for循环中i=m+1,所以此处的m=0
}//while
restday=restday-qx;
if(restday==0){
if(i==2)//在2月
if(r==1) d=rm[i];//run
else d=pm[i];//ping
else d=pm[i];//不在2月
}
else{//restday!=0
if(i==2)//在2月
if(r==1) d=rm[i]-restday;//run
else d=pm[i]-restday;//ping
else d=pm[i]-restday;//不在2月
}
printf("%d",y);
if(i<10) printf("-0%d",i);
else printf("-%d",i);
if(d<10) printf("-0%d\n",d);
else printf("-%d\n",d);
return 0;
}
Result: