cuber qq 很驚奇地發現 2020 年 1 月 22 日的 10:02:02 構成的字串竟然是乙個回文串。(構成的字串是 20200122100202 ),這下又有充足的理由約女神吃飯了。可是這之後,女神開始為難 cuber qq 了。她現在只允許 cuber qq 在回文時間約她吃飯。
回文時間指的是,年份(四位數字構成)+月份(兩位數字構成)+日期(兩位數字構成)+小時(兩位數字構成)+分鐘(兩位數字構成)+秒(兩位數字構成)所形成的字串是乙個回文字串。其中時間的表示形式是 24 小時制,例如下午 01:02 表示為 13:02 。
於是 cuber qq 開始期待之後的約會了。他現在想知道 2020 年 1 月 22 日的 10:02:02 之後第 k 個回文時間是多少(特別地,之後第 0 個回文時間就是 20200122100202 )。
保證他們約會的時間不可能晚於 9999 年 12 月 31 日的 23:59:59 。
輸入資料報含一行乙個整數 k ,表示要求的是之後的第 k 個回文時間。
保證對於給定的輸入,輸出的答案不會大於 99991231235959 ,即晚於 9999 年 12 月 31 日的 23:59:59 。
輸出一行乙個字串表示答案。
input
28677
output
95951211215959
本題的解題方法挺多的,可以考慮將中間10位變化不多(10次)的寫在陣列裡,只對年份進行判斷,也可以選擇直接計算出。這裡選擇用第二種方法來描述,可以幫助讀者理解。
首先我們可以看出,題目要求給出回文時間會受到月份、日期、時間三種格式的相互干擾,例如月份要求在01、02...12之間選擇,日期要求在01、02...31之間選擇。在觀察之後會發現,月份會與時相互作用,因此可選的月份有01、02、10、11、12,相應的時為10、20、01、11、21。同樣的年份前兩位與後兩位分別會與分秒相互作用,這裡有60種變化,00-05,10-15,...90-95。
因此開闢時間陣列t[8],t[0]t[1]表示年份前兩位有60種變化,t[2]t[3]表示年份後兩位有60種變化,t[4]t[5]表示月份有5種變化,t[6]與t[7]相等表示日期,只有0,1兩種可選。我們選擇0000011(1100000)為起點,這與題目要求的2020012(2100202)之間相差了7321(12*60*5*2+12*5*2+1),因此在輸入n之後加上這個距離即可。
#include using namespace std;
int main() ;
int n, a, b, c, d;
cin >> n;
n += 7321;
a = n / 600;
b = n % 600 / 10;
c = n % 10 / 2;
d = n % 2;
t[0] = a / 6;
t[1] = a % 6;
t[2] = b / 6;
t[3] = b % 6;
t[4] = (c > 1) ? 1 : 0;
t[5] = (c > 1) ? c - 2 : c + 1;
t[6] = d + 1;
for(int i = 0; i < 7; i++)
for(int i = 6; i >= 0; i--)
cout << endl;
return 0;
}
8633回文劃分
時間限制 1000ms 記憶體限制 1000k 我們說乙個字串是回文串,那麼意味著這個串從兩邊讀起來的字母都是一樣的。例如racecar是回文串,然而fastcar則不是。對乙個串的劃分意思是將乙個串劃分為若干個部分。例如,racecar可以劃分為race 和car兩部分。給出乙個串,要把這個串劃分...
21 回文數字
觀察數字 12321 123321 都有乙個共同的特徵,就是無論從左到右讀還是從右向左讀,都是相同的。這樣的數字叫做 回文數字。現在要從 5 位或 6 位的十進位制數字中找出各個數字之和等於 n 的回文數字。輸入乙個整數 n 10 n 100 輸出所有各個數字之和等於 n 的 5位和 6 位整數,每...
866 回文素數
求出大於或等於n的最小回文素數。回顧一下,如果乙個數大於 1,且其因數只有 1 和它自身,那麼這個數是素數。例如,2,3,5,7,11 以及 13 是素數。回顧一下,如果乙個數從左往右讀與從右往左讀是一樣的,那麼這個數是回文數。例如,12321 是回文數。示例 1 輸入 6輸出 7示例 2 輸入 8...