藍橋杯——算法訓練——天數計算
這道題思路簡單,但是由于輸入格式被卡在 83 83 83 分,無語之後寫篇部落格發洩一下。
——————————————————————————————————————
資源限制
時間限制: 1.0 s 1.0s 1.0s 記憶體限制: 256.0 M B 256.0MB 256.0MB
問題描述
編寫函數求某年某月某日(**** ** **)是這一年的第幾天 。提示:要考慮閏年,閏年的 2 2 2 月是 29 29 29 天(閏年的條件:是 4 4 4 的倍數但不是 100 100 100 的倍數,或者是 400 400 400 的倍數)。編寫主函數,輸入年月日,測試該函數并輸出結果。
輸入格式
按“ y y y y m m d d yyyy \space\space mm\space\space dd yyyy mm dd"的格式輸入年月日
輸出格式
輸出一個整數形式的計算結果
樣例輸入
1990 1990 1990 5 \space5 5 10 \space10 10
樣例輸出
130 130 130
資料規模和約定
根據實際輸入合法的日期
——————————————————————————————————————
思路分析:這道題沒有什麼複雜的地方,先打一張月份表,再借助 f o r for for 循環周遊月份依次疊加,最後再根據是否是閏年修正答案即可。直接看代碼:
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_leap_year(int y){
bool flag = false;
if(y % 4 == 0 && y % 100 != 0) flag = true;
else if(y % 400 == 0) flag = true;
return flag;
}
int count_days(int y, int m, int d){
int ans = 0;
for(int i=0; i<m; i++) ans += a[i];
ans += d;
if(is_leap_year(y) && m > 2) ans += 1;
return ans;
}
int main(){
// string date;
// getline(cin, date);
// int l = date.length();
// int y = 0, m = 0, d = 0, k = 1, t = l - 1;
// while(date[t] != ' '){
// d += (date[t] - 48) * k;
// k *= 10;
// t--;
// }
// k = 1;
// t--;
// while(date[t] != ' '){
// m += (date[t] - 48) * k;
// k *= 10;
// t--;
// }
// k = 1;
// t--;
// while(t >= 0){
// y += (date[t] - 48) * k;
// k *= 10;
// t--;
// }
int y, m ,d;
cin>>y>>m>>d;
cout<<count_days(y, m, d)<<endl;
return 0;
}
發洩寫在最後,輸入格式明明就是一個字元串,被注釋掉的部分是我一開始編寫的代碼,用來輸入帶空格字元串,再将其轉換為年月日資料,但是 o j oj oj 測評後卻給出 83 83 83 分,而且無論怎麼修改都卡在了 83 83 83。最後發現是輸入格式的問題,真是令人無語。