回文数 - 代码 - 考验细节处理、特判要做到不重不漏。
#include <iostream> #include <string> #include <algorithm> using namespace std; int a[10]; void solve() { int cna = 0, cnb = 0, p = -1; for(int i = 0; i < 10; i++) { cin >> a[i]; if(a[i] % 2 == 1) cna++, p = i; else if(a[i]) cnb++; } // 特判 if(a[0] == 1 && cna == 1 && cnb == 0) { cout << 0 << endl; return; } if(cna > 1 || (a[0] && a[0] % 2 == 0 && cna <= 1 && cnb <= 1 && a[p] == 1) || (a[0] && a[0] % 2 && cna == 1 && !cnb)) { // 这里容易漏判 cout << -1 << endl; return; } string ans = ""; if(!a[0]) { // 没 0 if(cna) a[p]--; for(int i = 1; i < 10; i++) { if(!a[i]) continue; int r = a[i]; r >>= 1; while(r--) { ans += (char)(i + '0'); } } string t = ans; reverse(t.begin(), t.end()); if(cna) ans += (char)(p + '0'); ans += t; } else { // 有 0 if(cna) a[p]--; int q = 0; for(int i = 1; i < 10; i++) { if(!a[i]) continue; ans += (char)(i + '0'); a[i]--; q = i; break; } int r = a[0] / 2; while(r--) { ans += '0'; } for(int i = q; i < 10; i++) { if(!a[i]) continue; int r = a[i]; r >>= 1; while(r--) { ans += (char)(i + '0'); } } string t = ans; reverse(t.begin(), t.end()); if(cna) ans += (char)(p + '0'); ans += t; } cout << ans << endl; } int main() { solve(); return 0; } // hack : 0 4 6 9 4 2 6 4 8 2 // hackii : 4 5 0 0 0 0 0 0 0 0
把 输出 0 的情况放后面一并处理。
#include <iostream> #include <string> #include <algorithm> using namespace std; int a[10]; void solve() { int cna = 0, cnb = 0, p = -1; for(int i = 0; i < 10; i++) { cin >> a[i]; if(a[i] % 2 == 1) cna++, p = i; else if(a[i]) cnb++; } // 特判 - 第三部分后面的 a[0] 改成了 a[0] > 1 if(cna > 1 || (a[0] && a[0] % 2 == 0 && cna <= 1 && cnb <= 1 && a[p] == 1) || (a[0] > 1 && a[0] % 2 && cna == 1 && !cnb)) { // 这里容易漏判 cout << -1 << endl; return; } string ans = ""; if(!a[0]) { // 没 0 if(cna) a[p]--; for(int i = 1; i < 10; i++) { if(!a[i]) continue; int r = a[i]; r >>= 1; while(r--) { ans += (char)(i + '0'); } } string t = ans; reverse(t.begin(), t.end()); if(cna) ans += (char)(p + '0'); ans += t; } else { // 有 0 if(cna) a[p]--; int q = 0; for(int i = 1; i < 10; i++) { if(!a[i]) continue; ans += (char)(i + '0'); a[i]--; q = i; break; } int r = a[0] / 2; while(r--) { ans += '0'; } for(int i = q; i < 10; i++) { if(!a[i]) continue; int r = a[i]; r >>= 1; while(r--) { ans += (char)(i + '0'); } } string t = ans; reverse(t.begin(), t.end()); if(cna) ans += (char)(p + '0'); ans += t; } cout << ans << endl; } int main() { solve(); return 0; } // hack : 0 4 6 9 4 2 6 4 8 2 // hackii : 4 5 0 0 0 0 0 0 0 0