【POJ1177 Pairs of Integers】整数对(无输出方案)
当N为奇数时:
若$N $%$ 11 \not = 10$,有一组答案,否则没有。
当N为偶数时:
设我们删去了A的第k位(个位为第0位),A前面的部分记为a,删去了b,后面的部分记为c。
$k=0$时处理方法与奇数相同。
则有$A=a \times {10}^k \times 10 + b \times {10}^k +c$,
$B=a \times {10}^k +c$。
所以$N=A+B=a \times {10}^k \times 11 + b \times {10}^k +2 \times c$,
$N \div {10}^k=a \times 11+ b + \lfloor 2 \times c \div {10}^k \rfloor$,
$a=N \div {10}^k \div 11,b=N \div {10}^k$ % $11,c=N $%${10}^k \div 2$
因为c可能进位或不进位,所以,对于每个$k(1\le k \le \lfloor \log_{10}^N \rfloor )$,
要多考虑进位的情况,即$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\n");
else
printf("0\n");
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\n",ntot);
return 0;
}