⑴ c语言程序设计;"已知2000年1月1日为星期六,请输入任一年的年份后,打印该年的年历" 怎么设计啊,速求老师
C语言程序如下:
#include<stdio.h>
#defineYES1/*定义符号常数“是”*/
#defineNO0/*定义符号常数“否”*/
/*函数isleap():判断某年是否闰年*/
intisleap(intyear)
{
intleap=NO;
if((year%4==0&&year%100!=0)||year%400==0)
leap=YES;
returnleap;
}
/*函数week_of_newyears_day():求元旦是星期几*/
intweek_of_newyears_day(intyear)
{
intn=year-1900;
n=n+(n-1)/4+1;
n=n%7;
returnn;
}
intmain(intargc,char*argv[])
{
intyear,month,day,weekday,len_of_month,i;
printf(" 请输入某年年份:");
scanf("%d",&year);
printf(" 请输入某年1月1日:");
scanf("%d",&weekday);
/*因为你的要求是已知2000年1月1日是星期六,所以这里不用week_of_newyears_day去求星期六了*/
/*weekday=week_of_newyears_day(year);求元旦是星期几*/
printf(" %d年 ",year);/*打印年份*/
for(month=1;month<=12;month=month+1)/*打印12个月的月历*/
{
printf(" %d月份 ",month);
printf("------------------------------------------------------ ");
printf("星期日星期一星期二星期三星期四星期五星期六 ");
printf("------------------------------------------------------ ");
for(i=0;i<weekday;i=i+1)/*找当月1日的打印位置*/
printf("");
if(month==4||month==6||month==9||month==11)
len_of_month=30;
elseif(month==2)
{
if(isleap(year))
len_of_month=29;
else
len_of_month=28;
}
else
len_of_month=31;
for(day=1;day<=len_of_month;day=day+1)/*打印当月日期*/
{
printf("%2d",day);
weekday=weekday+1;
if(weekday==7)/*打满一星期应换行*/
{
weekday=0;
printf(" ");
}
}
printf(" ");/*打完一月应换行*/
}
return0;
}
运行效果如图
⑵ C语言如何判断是闰年,闰年判断条件
不等价,因为判断闰年的标准是:1、能整除4且不能整除100 2、能整除400
你的意思是:
每4年有个闰年1896是闰年,4年后1900也是闰年除以4就是闰年
但严格上讲,"每4年一个闰年"这说法不严谨.应该是四年一闰,百年不闰,四百年再闰.
为什么呢?
1、产生闰年原因:地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year).公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年.
2、但是,上面算法又有了一个问题.就是0.2422*4=0.9688,比一天还差0.0322天,每4年差0.0322天不算多,但每400年就会差了约3天.即是说,假如每4年一个闰年,那么每400年就会有100个闰年,然后会多算了3天.
所以,就规定了每四百年中要减少三个闰年.公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的,虽然是100的倍数,也是平年.
综合以上2点,就有了现有的闰年判断标准.
⑶ C语言编程(程序怎样编写):给定年、月、日,计算该日是该年的第几天,然后计算该日是星期几。
/**
程序描述:给定年、月、日,计算该日是该年的第几天,然后计算该日是星期几。
*/
#include<stdio.h>
intmon[]={31,28,31,30,31,30,31,31,30,31,30,31};
intleap_year(intn)
{
if(n%400==0||(n%4==0&&n%100!=0))
return1;
else
return0;
}
intcal_dayCount(intyear,intmonth,intday)
{
inti,sum;
for(i=0,sum=0;i<month-1;i++)
sum+=mon[i];
if(month>2)
sum+=day+leap_year(year);
else
sum+=day;
returnsum;
}
intcal_weekday(intyear,intmonth,intday)
{
/**
蔡勒(Zeller)公式
历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和
一些分段计算公式),其中最着名的是蔡勒(Zeller)公式。
即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下,
w:星期;
c:年的高两位,即世纪-1
y:年的低两位;
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,
比如2003年1月1日要看作2002年的13月1日来计算);
d:日;
[]代表取整,即只要整数部分。
算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。
如果结果是负数,负数求余数则需要特殊处理:
负数不能按习惯的余数的概念求余数,只能按数论中的余数的定义求余。为了方便
计算,我们可以给它加上一个7的整数倍,使它变为一个正数,然后再求余数
以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:
蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54(除以7余5)
即2049年10月1日(100周年国庆)是星期5。
*/
inty,c,m,d;
intw;
if(month>=3)
{
m=month;
y=year%100;
c=year/100;
d=day;
}
else/*某年的1、2月要看作上一年的13、14月来计算*/
{
m=month+12;
y=(year-1)%100;
c=(year-1)/100;
d=day;
}
w=y+y/4+c/4-2*c+(26*(m+1))/10+d-1;
if(w<0)/*如果w是负数,则计算余数方式不同*/
{
w=7-(-w)%7;
}
else
{
w=w%7;//如果w等于0,表示为星期天
}
returnw;
}
intmain()
{
intyear,month,day;
intdayCount=0,i;
printf("请输入当前的年,月,日:");
scanf("%d-%d-%d",&year,&month,&day);
printf("该日是该年的第几天:%d ",cal_dayCount(year,month,day));
printf("该日是星期几:%d ",cal_weekday(year,month,day));
return0;
}
示例运行结果:
⑷ 用c语言写出一个求21世纪所有闰年的函数
main()
{float
a,b,c,s,temp;
scanf("%f%f%f",&a,&b,&c);
if(a+b<=c||a+c<=b||c+b<=a)
printf("输入错误");
else
{
s=(a+b+c)/2;
temp=sqrt(s*(s-a)*(s-b)*(s-c));
printf("三角形的面积为:\t");
printf("%3.4f\n",temp);
}
int
i;
printf("21世界的闰年为:\n");
for(i=2000;i<2100;i=i+4)
printf("%d\n",i);
getch();
}
⑸ C语言,NOJ上有一道题,探索合数世纪,不会做,望指点
您好,1、当x=1时,a-b+c=0;
2、当x=-2时,4a+2b+c=1;
3、a+b=1/3;
4、(2)-(1),得3a+3b=1;
5、从上面各式,可以求出:b=1/3-a,c=1/3-2a;
6、原方程变为:ax^2-(1/3-a)x+1/3-2a=0;
7、解方程,x = (1/3-a)+-sqrt((1/3-a)^2-4a(1/3-2a))/(2a) = [1/3-a+/-(3a-1/3)]/(2a)
解得两个根 x1 = 1(已知的);x2 = 1/(3a)-2
⑹ 如图,C语言程序设计题目,求第一个合数世纪(输入1),求指出错误在哪
提问程序问题强烈建议贴代码而不是截图,几乎没人愿意对着一个截图给你分析问题。
代码是正确的,但是结果一时半会是出不来的,因为算法时间复杂度太高,这个程序跑出结果,粗略估计需要半个小时左右。
主要是判断质数的地方太麻烦,优化的方法非常多,可以看书或者网上搜。
如果只想解决n=1,只要把
for(i=2;i<c;i++)
改成
for(i=2;i*i<=c;i++)
这样大概几秒内就能出第一个结果了。
如果把素数存下来,只用素数试除,速度还能再提升一点。
⑺ C语言:计算某日期是公元世纪以来的第几天
其实不用这样判断闰年,你把a=year-1,a/4就知道经过几个闰年了,经过a/4*366+(a-(a/4))*365+这一年经过的天数,(若余数为3,year为闰年)