回文数 - 代码 - 考验细节处理、特判要做到不重不漏。
#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
查看20道真题和解析
基恩士成长空间 426人发布