当N为奇数时:
若$N $%$ 11 ot = 10$,有一组答案,否则没有。
当N为偶数时:
设我们删去了A的第k位(个位为第0位),A前面的部分记为a,删去了b,后面的部分记为c。
$k=0$时处理方法与奇数相同。
则有$A=a imes {10}^k imes 10 + b imes {10}^k +c$,
$B=a imes {10}^k +c$。
所以$N=A+B=a imes {10}^k imes 11 + b imes {10}^k +2 imes c$,
$N div {10}^k=a imes 11+ b + lfloor 2 imes c div {10}^k floor$,
$a=N div {10}^k div 11,b=N div {10}^k$ % $11,c=N $%${10}^k div 2$
因为c可能进位或不进位,所以,对于每个$k(1le k le lfloor log_{10}^N floor )$,
要多考虑进位的情况,即$b=b-1,c=(N$ %$ {10}^k +{10}^k) div 2$。
因为A无前导0,所以要剔除$A=B=0$的情况。
还要满足:不进位$B le 9$,进位$B ge 0$。
最后把结果存起来,去重。
注意:要考虑所有情况和判断条件。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,ans[10002],tot,ntot;
int main()
{
cin>>n;
int fac=1,a,b,c,A,B,flag=n%2||n==10;
if (flag)
{
if (n%11!=10||n==10)
printf("1
");
else
printf("0
");
return 0;
}
while(fac<=n)
{
b=n/fac%11;a=n/fac/11;
c=(n-(a*11+b)*fac)/2;
A=fac*(10*a+b)+c;
B=fac*a+c;
if ((a+b)&&b<=9&&A!=B&&A+B==n)
{
ans[++tot]=A;
}
b=n/fac%11-1;a=n/fac/11;
c=(n-(a*11+b)*fac)/2;
A=fac*(10*a+b)+c;
B=fac*a+c;
if ((a+b)&&b>=0&&A!=B&&A+B==n) ans[++tot]=A;
fac*=10;
}
sort(ans+1,ans+1+tot);
ntot=unique(ans+1,ans+1+tot)-(ans+1);
printf("%d
",ntot);
return 0;
}