這篇文章將介紹常見的日期處理與進製轉換問題。以題目為例:
題目描述
有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天。
輸入有多組資料,每組資料有兩行,分別表示兩個日期,形式為yyyymmdd
輸出每組資料輸出一行,即日期差值
樣例輸入
20130101
20130105
樣例輸出5
細節
我們需要處理平年和閏年,大月和小月的問題。
思路我們不妨設第乙個日期是早於第二個日期的(如果不是就交換順序)。
求日期差值的問題很直接的乙個思路就是讓第乙個日期不斷加1天,直到和第二個日期相等為止。
為了存放平年和閏年每個月的天數,我們建立乙個二維陣列int month[13][2]
,第一維存放月份,從1到12,第0位不用,第二維為0表示平年,為1表示閏年。
我們可以先讓第乙個日期的年份加到與第二個日期的年份相差1為止,這樣可以加快速度。對於其中的年份,只要根據平年還是閏年加365或366天即可。之後再不斷讓天數加1就行。
**
#include #include #include using namespace std;
bool isleap(int y)
int month[13][2] = ,,,,,,,
,,,,,
};int main()
y1 = time1/10000,m1 = time1%10000/100,d1 = time1%100;
y2 = time2/10000,m2 = time2%10000/100,d2 = time2%100;
////if (isleap(y1) && m1 <= 2) ans += 1;
while (y1 < y2 || m1 < m2 || d1 < d2)
d1++; // 注意這裡放優化判斷之後
if (d1==month[m1][isleap(y1)]+1)
if (m1 == 13)
ans++;
} printf("%d\n",ans);
} return 0;
}
優化**參考:
優化**經過測試,存在漏洞,「20200229;20220301」這組資料會少一天,好像從閏年開始日期<=2月都會少一天。
codeup的資料應該不完整,上面這組資料和優化前**答案不一樣,但都能過。
把25行**解注釋應該就是正確答案,但是ac不了。
直接硬算是最靠譜的,不需要對年數優化。
以題目為例:
輸入兩個非負 10 進製整數 a 和 b (≤230−1),輸出 a+b 的 d (1輸入格式:
輸入在一行中依次給出 3 個整數 a、b 和 d。
輸出格式:
輸出 a+b 的 d 進製數。
輸入樣例:
123 456 8
輸出樣例:1103
思路
將乙個p進製數轉換為q進製數,分兩步:
將p進製數x轉換為10進製數y:
int y = 0,product = 1;
while (x!=0)
搞不清楚的話,可以拿二進位制數轉換為十進位制數作為參考。
2. 將10進製數y轉換為q進製數z:
除基取餘法。
int z[40],num = 0; // 陣列z用於存放q進製數y的每一位,num為位數
dowhile (y != 0);
最後將陣列z從高位z[num-1]到低位z[0]輸出,就是q進製數z。
搞不清楚的話,可以拿十進位制數轉換為二進位制數作為參考。
**
#include #include #include using namespace std;
int main()
while (a != 0);
for (int i=num-1;i>=0;i--)
puts("");
return 0;
}
提一點,pat的編譯器,如果按照scanf的一般寫法可能會警告,將scanf("%d",&t);
改成if(scanf("%d",&t)){};
就不會警告了。 日期轉換處理相關
declare dt datetime set dt getdate declare number int set number 3 1 指定日期該年的第一天或最後一天 a.年的第一天 select convert char 5 dt,120 1 1 b.年的最後一天 select convert ...
進製與轉換
按進製的方法進行計數,稱進製計數制 三個要素 數碼 基數 權 如 十進位制數776.55的位權展開式 7 10 2 7 10 1 6 10 0 5 10 1 5 10 2 展開式表示,數碼乘以各自權的累加和 如11011 b 2 4 2 3 2 1 2 0 27 100.11 b 2 2 2 1 2...
遞迴與進製轉換
今天學到了三樣東西,遞迴在進製轉換方面的的一些應用 進製轉換的快捷方法 命令列如何可以持續執行。includeint main 類似與這樣的快捷方法應該很好用吧!其實這因該在一開始是就想到的為什麼輸出總是 d呢?原來這就是十進位制的輸出方式,所以如果想快速的輸出可以 八進位制 o 十六進製制 x 這...