A回文数题解
回文数
https://ac.nowcoder.com/acm/contest/7745/A
这题实在太细节,前后WA了十几次
当有两个奇数或0的个数大于等于非0个数 输出-1
重要的是特判最后一个样例
后面就先处理回文串的前一半,再处理回文串的后一半
在代码中已经写了详细的注释
#include<bits/stdc++.h> using namespace std; int main() { int su=0,a[10],nu=0,s; for(int i=0; i<10; ++i) { scanf("%d",&a[i]),su+=a[i]; if(a[i]%2) nu++,s=i; } char ans[1000]={'\0'}; int cn=0; if(a[0]==1&&su-a[0]==0)//特判最后一个样例 { printf("0\n"); return 0; } if(nu>=2||a[0]>=su-a[0])//有两个奇数或0的个数大于等于非0个数 { puts("-1"); return 0; } if(nu)a[s]--; if(a[0]!=0) { for(int i=1; i<10; ++i) if(a[i]&&a[i]!=1) { a[i]--; ans[++cn]=(char)(i+'0'); for(int i=0; i<10; ++i)//处理前一半 { if(a[i]) { a[i]/=2; while(a[i]--) ans[++cn]=(char)(i+'0'); } } if(nu==1) //有奇数时,在末尾添加奇数 ans[++cn]=s+'0'; break; } } else { for(int i=0; i<10; ++i) { if(a[i]) { a[i]/=2; while(a[i]--) ans[++cn]=i+'0'; } } if(nu==1) ans[++cn]=s+'0'; } for(int i=1; i<=cn; ++i)//利用对称复制 ans[su-i+1]=ans[i]; for(int i=1; i<=su; ++i) printf("%c",ans[i]); puts(""); return 0; }