P1015 [NOIP1999 普及組] 迴文數
阿新 • • 發佈:2021-11-24
轉自洛谷
-
寫在前面
-
由於某些原因導致了這道題四個測試點居然WA了兩次太羞恥了:(
-
記得考慮輸入格式:十六進位制的輸入得用char讀
-
-
分析
- 先看輸入輸出格式:輸入兩行,輸出一行
- 再看輸入意義:N為進位制數,M為輸入資料
- 再看輸出意義:
- 能得到:printf("STEP=%d",ans);
- 得不到:printf("Impossible!");(有個歎號!!!)
- 再看題面:
- 迴文數:長度為\(l\)時,第\(i\)個數等於第(\(l-i-1\))個數
- 數M的長度在100位之內:高精度
- 30步以內能否得到迴文數:不斷計算直至第30次,如果出現迴文數就跳出迴圈,否則繼續
我也不知道寫點啥好了但是不寫這行好像太少了
- 由題面可知,這道題至少需要高精度、一個用於檢查迴文數的函式
-
開碼
-
讀入(注意十六進位制)
int h2i(char s){ if(s>='0'&&s<='9') return s-'0'; if(s>='A'&&s<='F') return s-'A'+10; } void input(){ char M[105]; scanf("%d%s",&N,&M); l = strlen(M); for(int i = l-1;i>=0;i--){ A[i] = h2i(M[l-i-1]); } }
注意:讀入的16進位制數不能直接用int陣列存;讀入時倒序比後期倒序會好寫些
(就是懶罷了) -
檢查是否為迴文數
bool check(){ for(int i = 0;i<l;i++){ if(A[i]!=A[l-i-1]) return false; } return true; }
注意:
其實沒啥好主意的我只是想保持格式整齊 -
迴文數高精度加法
void p(){ for(int i = 0;i<l;i++){ res[i] = A[i] + A[l-i-1]; }//直接進行一個迴文數的加而不用另開陣列儲存其迴文數 for(int i = 0;i<l;i++){ int nex = i+1;//下一個下標號,用於進位以及判斷是否超出原來位數 if(res[i] >= N){ if(nex >= l) l++;//若超出原來位數則位數+1 res[nex] += (res[i]/N); res[i] %= N; //進行一個位的進(bushi } } for(int i = 0;i<l;i++){ A[i] = res[i]; }//將結果陣列中的值賦值回A(由於是正數加法所以沒必要將A陣列清空,直接覆蓋就行) }
注意:註釋
-
主函式
int main() { //因為是全域性陣列所以就不用初始化了,初始全部為0 input(); for(int i = 0; i<30; i++) { if(check()) { printf("STEP=%d",i); return 0; } p(); } printf("Impossible!");//歎號!!!!!!啊啊啊啊啊啊啊啊 return 0; }
注意:注意審題,實在不行復制也可以
-