[Trick算法]给出年份和总天数求出对应月份

题目描述:给出年份(XXXX格式)和总天数(大于等于0的整数),求出对应月份,输入多组数据,以0 0结束。比如:输入2014 32->输出2

常规思维是用12个if...break分支语句,这样一来代码就会变的很长,而且重复率高,没有美感。

新的思路是,将每个月的天数存在一个数组里,然后设置一个累加变量sum,这个变量存从1月到第i+1个月的总天数,如果day小于等于sum,就输出数组对应的下标。

如此,代码就变的短巧美观多了:

/*由年份和总天数求出对应年份*/
/*以输入0 0结束*/ 
#include<stdio.h>
#include<stdlib.h>
int IsLeap(int y)
{
	if(y%400==0)/*能被400整除*/
	{
		return 1;
	}
	if(y%4==0&&y%100!=0)/*或者能被4整除但不能被100整除*/
	{
		return 1;
	}
	else
		return 0;
} 
int main()
{
	int year,month,day;
	while(scanf("%d %d",&year,&day)&&(year!=0||day!=0))
	{	
		int monthDayLeap[12]={31,29,31,30,31,30,31,31,30,31,30,31};/*闰年*/ /*用一个数组表示每个月的天数*/
		int monthDay[12]={31,28,31,30,31,30,31,31,30,31,30,31}; /*非闰年*/ 
		int sum;
		if(IsLeap(year))
		{	sum=0;
			for(int i=0;i<12;i++)
			{  
					if(day<=sum)
					{
						printf("%d\n",i);/*下标记录月份*/
						break;
					}
					else{
						sum=sum+monthDayLeap[i];
					}
			}
		}
		else{
			sum=0;
			for(int j=0;j<12;j++)
			{
				if(day<=sum)
				{
					printf("%d\n",j);
					break;
				}
				else{
					sum=sum+monthDay[j];
				}
			}
		}
		
	}
	return 0;
}

运行结果:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 按照某种格式输出系统时间:自学java中的时间。自学Date类(java.util.Date)和SimpleDateFormat类,用程序输出“当前时间是XXXX年XX月XX日XX时XX分XX秒(第XX周,周X)” 2 比较String与StringBuffer、StringBuilder的自增速度。方法:在自增前记录系统时间,进行5000次自增,然后再记录系统时间,可以得出自增的速度。获取系统时间的方法是java.lang.System.currentTimeMillis() ,见JDK API。 3 定义点类,圆是由圆心(点)和半径组成的,请完成圆类,注意“派”为常量,取3.14。圆类具有judge函数可以判断两圆的关系:相离、相交(包括相切)、嵌套、重合。设计static成员用以求所有圆对象的平均面积。(static、final) 4 图形间的关系可以下图用来表现。所有的图形中都可以称为Shape。由这个类可以派生出二维图形TwoDimensionalShape和三维图形ThreeDimensionalShape类。每个TwoDimensionalShape类应包括成员函数getArea以计算二维图形的面积。每个ThreeDimensionalShape类包含成员函数getArea和getVolume,分别计算三维图形的表面积和体积。编写一个程序,用一个数组乘放各种图形类对象(包括二维和三维的),并输出对象得相应信息。如果某个图形是TwoDimensionalShape就显示其面积,如果某个图形是ThreeDimenionalShape,则显示其面积和体积。请完成图中所有的类并在主函数中做测试。(继承与多态)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值