C語言簡單演算法變形題(1)

2021-10-11 00:16:22 字數 2335 閱讀 9062

本專欄將會涉及一系列簡單的演算法題及其變形題,並用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...