【POJ1177 Pairs of Integers】整数对(无输出方案)

当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;
}

 

原文地址:https://www.cnblogs.com/xzs123456/p/10402408.html