問題 g: 最小的回文數
時間限制: 1 sec 記憶體限制: 32 mb
[提交][狀態][討論版]
題目描述
回文數是從前往後和從後往前得到的數是相同的。
現給你乙個正整數n,請你找到比n大的最小的那個回文數p。
輸入輸入包含多組測試資料。
每組輸入乙個正整數n,n不超過10000位,並且n不包含前導0。
輸出對於每組輸入,輸出比n大的最小的那個回文數p。
樣例輸入
44
3175
樣例輸出
55
4181
提示
/*解題思路:
字串處理。
分為原來使回文,原來不是回文兩部分來處理。
原來是回文,要特殊考慮一下全是9的情況,直接輸出乙個1,然後length-1個0,最後加乙個1。
原來是回文且不全是9,只需要從對稱軸開始找第一對不為9的+1就ok(長度為奇數我當中間同乙個數為一對)
原來不是回文,明確一點,不能變小!
所以 對稱軸左邊的值 先賦值 給它們對稱的位置
這讓原來不是回文的變成了乙個回文,但是並不能保證它沒有變小。
所以變成回文後,與原來的那個串比較一下,如果比之前大,那這個就是結果。
如果沒有比之前大,那就把這個串(已經變成了回文串)按原來那樣是回文的時候一樣處理就行!
*/ac_code:
#include
using namespace std;
const
int maxn =
1e4+5;
char s[maxn]
;char st[maxn]
;void
solve
(char
* s,
int cnt,
int len)
printf
("1\n");
return;}
if(s[pos]
!='9'
)else
s[pos]
= s[len-
1-pos]
= s[pos]+1
;}printf
("%s\n"
,s);
return;}
intmain()
if(s[i]
=='9'
) i==j ? cnt +=1
: cnt +=2
;}if(flag)
else
if(st[i]
=='9'
) i==j ? cnt +=1
: cnt +=2
;}if(
strcmp
(st,s)
>0)
printf
("%s\n"
,st)
;else
solve
(st,cnt,len);}
memset
(s,'\0'
,sizeof
(s));}
return0;
}
syu問題 G 回文數猜想
乙個正整數,如果從左向右讀 稱之為正序數 和從右向左讀 稱之為倒序數 是一樣的,這樣的數就叫回文數。任取乙個正整數,如果不是回文數,將該數與他的倒序數相加,若其和不是回文數,則重複上述步驟,一直到獲得回文數為止。例如 68變成154 68 86 再變成605 154 451 最後變成1111 605...
字串問題 回文最小分割數
題目 給定乙個字串str,返回把str全部切成回文子串的最小分割數。舉例 str aba str本身就是回文串,返回0.str acdcdcdad 最少需要切兩次變成3個回文子串,所以返回2.基本思路 本題是乙個經典的動態規劃的題目。定義動態規劃陣列dp,dp i 的含義是子串str 0 i 至少需...
構成最小回文數的分析
給定字串,可以通過插入字元,使其變成回文,求最少插入字元的數量。比如poj 1159 這題 ab5db可以最少插入兩個字元 構成回文 abd5dba abcd可以最少插入三個字元 構成回文 abcdcba 分析 用動態規劃。設字元為str 長度為n,下標的開始為l,結束為h 那麼如果str l st...