老早就尝试过这题..结果枚举方式不是很简洁...写起来各种蛋疼..昨晚听了惊奇哥的讲解就果断水了...
设B=Bn,Bn-1,...B2,B1 枚举是再哪个位置插入了个位数k...比如枚举是第i位后面插入了个位数k..那么得到的
N=11*(Bn,Bn-1,...Bk+1)*(10^(i+1))+k*(10^i)+2*(Bk-1..B2,B1)
应该不难理解吧...题目是给出了N...那么就反过来推了..看我程序吧..注意的就是一些情况的处理..如:
推出的中间数必须是个位数(有可能得到10..那么显然这个数是要不得的.)..
末尾的(Bk-1...B2,B1)不一定就是(Nk-1...N2,N1)/2阿..有可能是(1,Nk...N2,N1)/2...就如同后缀为2的..可能是1+1=2的2..也可能是6+6=12的2..
要排除10=05+5的这种错误情况..就是前缀和中间个位数不能同时为0..
最后..输出的时候让相同的数只输出一个...
仔细想想..其实本题思路也不难想到了..思维应该更加灵活阿...
Program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int N,B,k,x,y,i,m,ans[1000],num;
int main()
{
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
while (~scanf("%d",&N))
// for (N=9000;N<=10000;N++)
{
if (!N) break;
num=0;
y=N/11; x=N%11;
if (x<10) ans[++num]=y*10+x;
i=10;
if (N%2!=1)
while (i<=N)
{
x=(N%i)/2;
m=N/i;
y=m/11;
k=m%11;
if (k<10)
{
k=y*(i*10)+k*i+x;
ans[++num]=k;
}
x=(N%i+i)/2;
k=m%11-1;
if (k>=0 && (y || k))
{
k=y*(i*10)+k*i+x;
ans[++num]=k;
}
i*=10;
}
// printf("%d: ",N);
if (!num) printf("No solution.\n");
else
{
sort(ans+1,ans+1+num);
printf("%d",ans[1]);
for (i=2;i<=num;i++)
if (ans[i]!=ans[i-1]) printf(" %d",ans[i]);
printf("\n");
}
}
return 0;
}