本專欄將會涉及一系列簡單的演算法題及其變形題,並用c語言給出例程。
不定期更新在專欄中
輸入乙個日期,判斷該日期是本年第幾天;
#include
int days_of_month[12]
=;// 前面有乙個 0 的目的是使得下標與月份對齊,不用再-1
intisleapyear
(int year)
if(year %
100==0)
if(year %
400==0)
return flag %2;
}int
main()
for(
int i =
1; i < month; i++
) sum +
= day;
// 對第n月的累計
printf
("%d"
, sum)
;return0;
}
輸入乙個人的生日,以及目標天的日期,判斷ta在世上已經度過了多少天。
演算法分析:
資料分析
首先,要想明白這若干天是如何劃分的,從特殊性與普遍性入手:
特殊性:沒有度過完整一年:出生年、當前年;我們不妨畫乙個**來表示:普遍性:度過了完整年的時間段;
出生年
中間年
當前年
出生日及出生日前
出生日後
目標日及目標日前
目標日後ab
cde
所求分析
根據上表可知,我們需要的值是b+c+d
資料處理以及計算首先考慮最簡單的部分:c
c是整年部分,所以只需要用for
迴圈將中間年完整相加即可。注意每遇到閏年,都需要格外再加上一天;
其次考慮:d
d之所以次簡單,是因為我們的母題中已經寫好了求年內某一天的演算法,我們只需要拿過來稍加包裝就可以了。
最後考慮:b
演算法一:
因為a是已知的(由母題求得),因此我們可以用出生年的整年天數(仍然需要注意閏年)減去a的天數,得到b。
演算法二:
我們易求得的數分別是:整年數、某日期前的天數,那麼如果我們把出生年併入c的迴圈中,再減去a的值,就可以得到與演算法一同樣的結果。這樣書寫比較簡潔易懂
最後我們得到了如下計算式:
result = (a+b+c) - a + d
最後根據上述分析,編寫出程式:
#include
int days_of_month[12]
=;struct date
;int
isleapyear
(int year)
if(year %
100==0)
if(year %
400==0)
return flag %2;
}int
dayofyear
(struct date sample)
for(
int i =
1; i < sample.month; i++
) sum +
= sample.day;
return sum;
}int
main()
}// 最後加上d,減去a
sum +
=dayofyear
(today)
-dayofyear
(birthday)
;// result
printf
("%d"
, sum)
;return0;
}
該題是對日期計算型題目的乙個小公升級,難度不大。
重點是如何對所求進行分析,分析出優化的計算方法,以求減少機械的重複計算。
本題中還涉及到一種簡化程式設計的思想:**重用。養成將一些完整的功能模組編寫成函式的習慣,可以為日後提供方便,不用多次重複造自己已經造好的輪子。
答疑專用qq號:day_dreamer: ( 3578974183 )
個人blog:
c語言 簡單的c語言題合集
楊輝三角 楊輝三角這一類的題型全都是找規律,無一例外 個人感覺這類找規律的題型完全是出題人閒得無聊,但是c語言考試無論是期中期末甚至考研都考 還是在這裡做乙個記錄吧 include include intmain for int i 1 i n i 設定是以1為下標開始的,i代表行號 for int...
簡單了解C語言(1)
alt shift enter 全屏 define crt secure no warnings include include include define size 5 enum 全域性變數出現在所有函式之外 區域性變數出現在某個函式的內部 如果有乙個區域性變數和全域性變數同名,這時使用這個變數...
簡單的C語言練習 1
1.列印100 200之間的質數 程式的設計思路 先初始化乙個變數i且讓i從2開始自增,讓每乙個數去除以i取餘,如果i一直自增到等於該數都沒有整除的數字,則證明這個數是質數.具體 如下 include include intmain 如果i迴圈到最後等於num跳出迴圈,說明這個數字是素數 if nu...