2015_蓝桥_C/C++_B组_2题

2.星系炸弹

 

X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。

 

每个炸弹都可以设定多少天之后爆炸。

 

比如:阿尔法炸弹201511日放置,定时为15天,则它在2015116日爆炸。 有一个贝塔炸弹,2014119日放置,定时为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:计算天数,和期限比较控制循环 //r1是闰年//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不清

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:计算天数,和期限比较控制循环 //r1是闰年//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不清

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值