hdu1271-----整数对 数学题

很有技巧的一道数学题。

本题思路:假设要求的数字为A,去除的为第k位,那么按照这个规则,将A划分为三段:高位c,k位b,低位a,则x=a*10^(k+1)+b*10^k+c去除后为B=a*10^k+c,那么n=A+B=(11a+b)*10^k+2c;

但是由于2c有可能带来进位,可能会使b进1,但是不会对a出现影响,那么a就可以直接求出了。再通过a求出b,然后求出c;求c时分进位和没有进位两种情况,记录下来,然后排序一下输出。
View Code
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    int a,b,c,i,n,ans[201],num;
    while(scanf("%d",&n)!=EOF&&n)
    {
        num=0;
        for(i=1;i<=n;i*=10)
        {
            a=n/i/11;
            b=n/i-11*a;
            if(b<10&&(a||b))//a,b都为0时不符合条件
            {
                c=(n-(11*a+b)*i)/2;
                if(11*a*i+b*i+2*c==n)
                ans[num++]=a*i*10+b*i+c;
            }
            if((--b>=0)&&(a||b))//这里不用else,a,b相同的情况c有可能不同
            {
                c=(n-b*i-a*i*11)/2;
                if(11*a*i+b*i+2*c==n)
                ans[num++]=a*i*10+b*i+c;
            }
        }
        if (num==0) printf("No solution.");
        else
        {
        sort(ans,ans+num);
        printf("%d",ans[0]);
        for(i=1;i<num;i++)
        {
            if(ans[i]!=ans[i-1])//有可能有时进位或不进位结果是一样的,删去结果重复的答案
            printf(" %d",ans[i]);
        }
        }
        puts("");
    }
}

 

posted @ 2012-06-30 17:48  To be an ACMan  Views(174)  Comments(0)    收藏  举报