⑴ 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為閏年)