#include <bits/stdc++.h>
using namespace std;
const int N = 1000+10;
char s[N];
void jf(char *s,char *s1) ///高精度減法 s = s-s1; 只用於s>s1,且都爲正
{
int num1[N] = {0},num2[N] = {0};
int lens = strlen(s),lens1 = strlen(s1);
for(int i = 0;i < lens;i++)
num1[i] = s[i]-'0';
for(int i = 0;i < lens1;i++)
num2[i] = s1[i]-'0';
for(int i = lens-1,j = lens1-1;i >= 0 && j >= 0;--i,--j)
num1[i] -= num2[j];
for(int i = lens-1;i >= 0;i--){
if(num1[i] < 0){
num1[i] += 10;
num1[i-1]--;
}
}
bool flag = true;
for(int i = 0;i < lens && flag;i++){
if(num1[i]){
for(int j = 0;i+j <= lens;j++){
s[j] = num1[i+j]+'0';
if(i+j == lens) s[j] = '\0';
}
flag = false;
}
}
if(flag)
strcpy(s,"0");
}
vector<string> vt; ///存答案
int main(void)
{
int T;
scanf("%d",&T);
int cas = 1;
while(T--){
vt.clear();
scanf("%s",s);
printf("Case #%d:\n",cas++);
while(1){
int len = strlen(s);
char s1[N] = {0};
for(int i = 0;i < (len+1)/2;i++)
s1[i] = s[i];
for(int i = 0,j = len-1;i < len/2;i++,j--)
s1[j] = s1[i];
s1[len] = '\0';
int t = strcmp(s1,s);
if(t == 0){ ///s1 == s 保存然後跳出去
vt.push_back(s1);
break;
}
else if(t < 0){ ///s1<s s減掉s1然後把s1存進去
jf(s,s1);
vt.push_back(s1);
}
else{ ///s1>s 把s的一半取出來-1構造迴文串
char s2[5] = "1";
for(int i = 0;i < (len+1)/2;i++)
s1[i] = s[i];
s1[(len+1)/2] = '\0';
jf(s1,s2);
int lens1 = strlen(s1);
int tmp;
if(len%2 == 0) tmp = lens1-1; ///s串長度爲偶數就構造一個偶數長度的串,奇數就構造奇數長度的串
else tmp = lens1-2;
for(int i = tmp,j = lens1;i >= 0;i--,j++)
s1[j] = s1[i],s1[j+1] = '\0';
if(strcmp(s1,"00") == 0) strcpy(s1,"1");
vt.push_back(s1);
jf(s,s1);
}
}
printf("%d\n",vt.size());
for(int i = 0;i < (int)vt.size();i++)
cout<<vt[i]<<endl;
}
return 0;
}
tjut 5920
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/luozhong11/article/details/53038624
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.