mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
71 lines
1.8 KiB
C++
71 lines
1.8 KiB
C++
#include <iostream>
|
||
#include <cstdio>
|
||
#include <cstring>
|
||
#include <cmath>
|
||
#include <algorithm>
|
||
#include <string>
|
||
#include <cstdlib>
|
||
#include <vector>
|
||
#include <set>
|
||
#include <map>
|
||
using namespace std;
|
||
const double eps=1e-8;
|
||
int len;
|
||
//大数乘法
|
||
void subtract(char *a,char *b,char *c)
|
||
{
|
||
for(int i=len-1;i>=0;i--)
|
||
{
|
||
c[i]=a[i]-b[i]+'0';
|
||
if(c[i]<'0')c[i]+=10,a[i-1]--;
|
||
}
|
||
}
|
||
|
||
char str[2][1005],sub[50][1005];
|
||
int main()
|
||
{
|
||
int i,j,k,n;
|
||
scanf("%d",&n);getchar();
|
||
for(int h=1;h<=n;h++)
|
||
{
|
||
memset(sub,'0',sizeof(sub));
|
||
gets(str[0]);
|
||
len=strlen(str[0]);
|
||
int old=1,now=0;
|
||
int cnt=0;
|
||
for(i=0;str[now][i];)//前置0到末尾,整个数就是0
|
||
{
|
||
old^=1,now^=1;//滚动数组
|
||
if(!strcmp(str[old]+i,"10"))//10=9+1
|
||
{
|
||
sub[cnt][0]='9';sub[cnt][1]=0;cnt++;
|
||
sub[cnt][0]='1';sub[cnt][1]=0;cnt++;
|
||
break;
|
||
}
|
||
for(j=i;j<=len-1-j+i && str[old][j]<=str[old][len-1-j+i];j++);
|
||
strcpy(sub[cnt],str[old]);
|
||
if(j<len-1-j+i)//对折后有小于的,就只能取较小的回文数
|
||
{
|
||
sub[cnt][(i+len-1)/2]--;
|
||
for(j=(i+len-1)/2;j>=0 && sub[cnt][j]<'0';j--)sub[cnt][j]+=10,sub[cnt][j-1]--;
|
||
}
|
||
for(j=0;sub[cnt][j]=='0';j++);//去前导0
|
||
for(k=j;k<=len-1-k+j;k++)sub[cnt][len-1-k+j]=sub[cnt][k];//根据前半串对折构造后半串
|
||
sub[cnt][len]=0;
|
||
subtract(str[old],sub[cnt],str[now]);
|
||
for(;str[now][i]=='0';i++);
|
||
cnt++;
|
||
}
|
||
printf("Case #%d:\n%d\n",h,cnt);
|
||
for(i=0;i<cnt;i++)
|
||
{
|
||
char *s;
|
||
for(s=sub[i];*s=='0';s++);
|
||
puts(s);
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
ugly problem
|