题意:给定一个很大的数,把他们分为数个回文数的和,分的个数不超过50个,输出个数并输出每个数,special judge。
题解:现场赛的时候很快想出来了思路,把这个数从中间分为两部分,当位数为偶数的时候3456就分为34和56,34-1=33,回文数3333,3456-3333=123然后继续算;当位数为奇数的时候34567就分为34和67,5-1=4,回文数34443,34567-34443=124然后继续算。但是一年都没有写过高精度减法的题了,这个大模拟写了很久最后判断奇偶性都判断蒙了- - !,汗。考虑的太复杂了,前导0,奇偶性,如果前面比后面小就不减1的情况,有的是我想多了,找了一份比较短的代码虚心学习一下,写的很棒。
#include<bits/stdc++.h>
using namespace std;
const int N=+; bool getPal(char *s) { //得到回文数
int n=strlen(s);
if(n==)return ;
if(n==&&s[]=='') {
s[]='';
s[]=;
return ;
}
s[(n+)/-]--;
for(int i=(n+)/-; i>; i--) {
if(s[i]<'')s[i]+=,s[i-]--;
else break;
}
if(s[]=='') {
for(int i=; i<n; i++)s[i]=s[i+];
n--;
}
for(int i=(n+)/; i<n; i++)
s[i]=s[n-i-];
return ;
}
bool subStr(char *a,char *b) { //减去回文数
int na=strlen(a);
int nb=strlen(b);
for(int i=na-,j=nb-; j>=; i--,j--) {
if(a[i]>=b[j])a[i]=a[i]-b[j]+'';
else a[i]=a[i]+-b[j]+'',a[i-]--;
}
int p;
for(p=; a[p]==''; p++);
if(p==na)return ;
for(int i=; p<=na; p++,i++)a[i]=a[p];
return ;
}
char s[N],ans[][N];
int cnt;
int main() {
//freopen("f.txt","r",stdin);
int T;
scanf("%d",&T);
for(int cas=; cas<=T; cas++) {
scanf("%s",s);
for(cnt=;; cnt++) {
strcpy(ans[cnt],s);
if(getPal(ans[cnt])||subStr(s,ans[cnt]))break;
} printf("Case #%d:\n%d\n",cas,cnt+);
for(int i=; i<=cnt; i++)
printf("%s\n",ans[i]);
}
return ;
}