誰もが醜い問題を嫌っています。
あなたは正の整数を与えています。あなたは回文数の合計によってその数を表している必要があります。
回文数は、あなたがゼロを招くことなく、小数点の文字列としてその整数を書き出す場合は、文字列が回文であるような正の整数です。例えば、図1は、回文数であり、10ではありません。
あなたは正の整数を与えています。あなたは回文数の合計によってその数を表している必要があります。
回文数は、あなたがゼロを招くことなく、小数点の文字列としてその整数を書き出す場合は、文字列が回文であるような正の整数です。例えば、図1は、回文数であり、10ではありません。
入力の最初の行InputIn、テストケースの数を表す整数Tが存在します。
各テストケースのために、指定された整数S(説明のみ一行ある 1つの≤ S ≤ ?10 1000年 ).OutputFor各テストケース、出力「ケース#X」xはそのテストケースの数が最初の行にそして、1出力からあなたが使用回文数の数を開始し、nは、1行に。nが、それぞれが自分の回文数の1つを含む、これ以上en50より出力n行でなければなりません。それらの和は正確にs.Sample入力しなければなりません
2 18 1000000000000サンプル出力
ケース#1: 2 9 9 ケース#2: 2 999999999999 1ヒント
9 + 9 = 18 999999999999 + 1 = 1000000000000
ID-OJ:
HDU-5920
著者:
Caution_Xの
提出のDATE:
20191029個の
タグ:
アナログ
説明モデリング:
数を考えるとnは、数nを加えて、いくつかの回文配列の数の数に分割され
た出力:解体どのように多くは、それぞれの数の数と大きさとなっている
、それを解決するための主な手順:
無作為に2つの回文配列に分割番号を入れて明らかに非常に非現実的です。
我々はそれを除去することができる最大解体パリンドローム配列に従うことができる:N = N1(パリンドローム配列)+ N2
n2はパリンドロームである場合、n2は、N N2新たな分割位置が利用できる数である代わりに、パリンドローム配列でない場合文字列の末尾、出力答え。
警告を表す:
N-10 =レイド決意の
ACコード:
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; CHAR NUM [ 1005 ]、サブ[ 1005 ]; CHAR ANSは、[ 55 ] [ 1005 ]; char型ワン[ 2 ] = " 1 " ; BOOLジャッジ(チャー *のS) { //はデジタルパリンドロームの現在の数かどうかを決定する int型レンズ=の、STRLEN(S) のための(int型 I = 0 ; Iは、レンズ/ < 2 ; Iは++ ){ IF!I - - (S [I] =のS [レンズ。1 ]){ リターン 偽; } } 戻り 真。 } ボイド減少(チャー * S1と、チャー *のS2) { int型 LEN1 = STRLEN(S1)。 INT LEN2 = STRLEN(S2)。 INT I = len1- 1、J = len2- 1、フラグ= 0 。 一方、(I> = 0 && J> = 0 ){ 場合(S1 [i]が- ' 0 ' -flag> = 0 ){ S1 [i]は - = フラグ。 フラグ = 0 。 } 他{ S1 [i]は = S1 [i]が+ 10 - 旗。 フラグ = 1 。 } であれば(S1 [i]が> = S2 [J]){ S1 [i]は = S1 [i]が-S2 [J] + ' 0 ' 。 } 他{ S1 [i]は = S1 [i]が+ 10 -S2 [J] + ' 0 ' 。 フラグ = 1 。 } I - 、j-- 。 } ながら(I> =0 && フラグ){ 場合(S1 [i]が- ' 0 ' > = フラグ){ S1 [i]は - = フラグ。 フラグ = 0 。 } 他{ S1 [i]は = S1 [i]が+ 10 - 旗。 フラグ = 1 。 } I - 。 } int型の ID = 0 。 ブール pre_0 = 真; チャー TMP [ 1005 ]。 memsetの(TMP、 0、はsizeof (TMP))。 用(int型のk = 0 ; LEN1 <Kあり、k ++ ){ 場合(S1 [K] == ' 0 ' && pre_0)を 続けます。 もし(!S1 [K] = ' 0 ' && pre_0)pre_0 = 偽; TMP [ID ++] =のS1 [k]は、 } もし(!ID){ TMP [ID ++] = ' 0 ' 。 } TMP [ID] = ' \ 0 '。 strcpyの(S1、TMP)。 } ボイドパリンドローム(のchar * s1を、チャー *のS2) { int型 LEN1 = STRLEN(S1)、LEN2。 もし(LEN1の== 2つの && S1 [ 0 ] == ' 1 ' && S1 [ 1 ] == ' 0 ' ){ S2 [ 0 ] = ' 9 ' 。 S2 [ 1 ] = ' \ 0 ' 。 返します。 } であれば(LEN1&1)LEN2 = LEN1 /2 + 1 。 他 LEN2 = LEN1 / 2 ; 以下のために(int型 i = 0 ; iは<LEN2; iは++ ){ S2 [i]は =のS1 [i]は、 } S2 [LEN2] = ' \ 0 ' 。 減少(S2、1つ)。 もし(S2 [ 0 ] == ' 0 ' ){ S2 [ 0 ] = ' 1 ' ; } のために(int型 I = len1- 1、J = 0 ; jは<I、J ++、i--){ S2 [i]は = S2 [J]。 } S2 [LEN1] = ' \ 0 ' 。 } int型のmain() { // freopenは( "INPUT.TXT"、 "R"、STDIN)。 INT T、カセ= 1 。 scanf関数(" %のD "、&T)。 一方、(T-- ){ scanf関数(" %sの" 、NUM)。 INTの ID = 0 。 一方、(NUM [ 0 ]!= ' 0 ' && ID < 50){ 場合(裁判官(NUM)){ strcpyの(ANS [ID ++ ]、NUM)。 破ります; } のmemset(サブ、0、はsizeof (サブ))。 パリンドローム(NUM、サブ)。 strcpyの(ANS [ID ++ ]、サブ)。 減少(NUM、サブ)。 } のprintf(" ケース#1%のD:\ n%Dを\ n "、加瀬++ 、ID)。 以下のために(int型 I = 0 iは++; iはID < {) のprintf(" %sをする\ n "、年[I]); } } }