天天看點

藍橋杯——算法訓練——天數計算

藍橋杯——算法訓練——天數計算

這道題思路簡單,但是由于輸入格式被卡在 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。最後發現是輸入格式的問題,真是令人無語。

繼續閱讀