C++實現通過年份與天數判斷月份日期
阿新 • • 發佈:2019-01-10
近期為了準備CCF認證考試,自己隨便練習遇到的一道經典題,所以寫下來,自己的思路想法。
先把題目列出來
給定一個年份y和一個整數d,問這一年的第d天是幾月幾日?
注意閏年的2月有29天。滿足下面條件之一的是閏年:
1)年份是4的整數倍,而且不是100的整數倍;
2)年份是400的整數倍。
輸入格式
第一行包含一個整數y,表示年份,年份在1900到2015之間(包含1900和2015)。
輸出格式
輸出兩行,每行一個整數d,d在1至365之間。
樣例輸入
2015
80
樣例輸出
3
21
再上程式碼,如果某些人需要,這樣就不用看後面了!
#include<iostream>
using namespace std;
bool isRunyear(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
return true;
}
else{
return false;
}
}
int main(){
int year;
cin >> year;
int day;
cin >> day;
bool bl;
bl = isRunyear(year);
int iArr[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int count = 0,count1=0;
if (bl==true)
{
//表明是閏年
iArr[1] = 29;
for (int i = 0; i < 12; i++)
{
count1 = count;
count += iArr[i];
if (day>count1&&day <= count){
cout << i+1 << endl;
cout << day - count1 << endl;
break;
}
}
}
else{
//表明是平年
for (int i = 0; i < 11; i++)
{
count1 = count;
count += iArr[i];
if (day>=count1&&day <= count){
cout << i + 1 << endl;
cout << day - count1 << endl;
break;
}
// else if (day == count){
// cout << i + 1 << endl;
// cout << day - count1 << endl;
// }
}
}
return 0;
}
接著是執行結果:
前面兩行是你輸入的資料,後面的是輸出結果
(https://img-blog.csdn.net/20160902160654748)
這裡為使整個結構看得更清晰一點,我把是不是閏年單拿出來,寫成外部函式。很簡單的一段,我就不詳細說了。主要是下面判斷幾月份以及具體哪一天的時候是關鍵點:
首先,把平年的每個月到底有幾天,以陣列的形式存起來,在下面的判斷是不是閏年之後,直接改變iArr[1](即二月份的天數)的值。用兩個計數變數,是用來儲存加iArr[i]之前與加之後的兩個值,這樣雖然宣告的變數多了,佔的空間多了,但至少思路更清晰,更容易明白。
for (int i = 0; i < 12; i++)
{
count1 = count;
count += iArr[i];
if (day>count1&&day <= count){
cout << i+1 << endl;
cout << day - count1 << endl;
break;
}
}
for迴圈是為了累加,當你輸入的d資料恰好大於加iArr[i]之前的值,又小於加完以後的天數時,說明找到了那個臨界點,由於i 還是下標,所以加一,就能得到月份,day-count1就恰好是那個月的第幾天了。
這裡還有個注意事項,就是臨界狀態,你所輸入的資料,恰好是某個月最後一天,這樣所單獨拿出來,測試了一下:
// else if (day == count){
// cout << i + 1 << endl;
// cout << day - count1 << endl;
// }
後來一看,跟把它直接加入到上面的迴圈判斷的時候一樣,所以,就註釋掉了。
當然,這份程式碼還有好多沒有考慮到:
比如:輸入的資料是否符合要求,年份,天數,都要進行判斷,還要儘可能的簡化程式碼。