题意: 拆解成小于等于50个回文串
思路:
从中间分割,使得左右对称,字符串做-法
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
char a[10005];
char b[10005];
char c[10005];
char ans[55][10005];
int all=0;
int flag=0;
void sub()
{
strcpy(c,b);
if(flag)
for(int i=0;i<strlen(c);i++)
c[i]=c[i+1];
all++;
strcpy(ans[all],c);
int len=strlen(a)-1;
int n = len;
int t;
while(len>=0)
{
if(a[len]-b[len]<0)
{
a[len]=a[len]-b[len]+10+'0';
a[len-1]--;
}
else
a[len]=a[len]-b[len]+'0';
if(a[len] != '0') t = len;
len--;
}
for(int i = 0; i <= n - t; i++){
a[i] = a[i + t];
}
a[n - t + 1] = '\0';
}
int main()
{
int t;
scanf("%d",&t);
for(int cs=1; cs<=t; cs++)
{
flag=0;
all=0;
memset(ans,0,sizeof(ans));
scanf("%s",&a);
int i,j;
while(1)
{
if(strlen(a)==1)
{
all++;
strcpy(ans[all],a);
break;
}
if(strlen(a)==2&&a[0]=='1')
{
all++;
memset(c,0,sizeof(c));
c[0]='9';
strcpy(ans[all],c);
int res=0;
for(int i=0;i<2;i++)
res=res*10+a[i]-'0';
c[0]=res-9+'0';
all++;
strcpy(ans[all],c);
break;
}
strcpy(b,a);
strcpy(c,a);
int tmp=strlen(a);
if(tmp%2==1)
{
i=tmp/2;
j=tmp/2;
}
else
{
i=tmp/2-1;
j=tmp/2;
}
int fi=i,fj=j;
if(a[i]>a[j])
{
a[i]--;
while(i>=0)
{
b[i]=a[i];
b[j++]=a[i--];
}
}
else if(a[i]==a[j])
{
if(a[fi]=='0')
{
a[fi]='9';
while(a[fi--])
{
if(a[fi]!='0')
{
if(a[fi]=='1'&&fi==0)
flag=1;
a[fi]--;
break;
}
a[fi]='9';
}
}
else
{
a[fi]--;
}
if(i==j)
{
b[j]=a[i];
if(!flag)
i--,j++;
else
j++;
}
while(i>=0)
{
b[i]=a[i];
b[j++]=a[i--];
}
if(flag)
{
b[0]='0';
for(int i=1;i<tmp;i++)
b[i]='9';
b[tmp]='\0';
}
}
else
{
while(i>=0)
{
b[i]=a[i];
b[j++]=a[i--];
}
}
strcpy(a,c);
sub();
if(strlen(a)==1)
{
all++;
strcpy(ans[all],a);
break;
}
}
printf("Case #%d:\n",cs);
printf("%d\n",all);
for(int i=1;i<=all;i++)
printf("%s\n",ans[i]);
}
return 0;
}