HDU 1271 整数对

题目链接:Click here~~

题意:

给你一个数n,找到另外一个数x,使得x加上x'等于n,其中,x'为x删去某一位(如第k位,假设最低位为第0位)上的数字后余下数字组成的数。

解题思路:

对于任意一个数字x,在此题环境下,我们都可以把它分解成3部分,k位左边部分,k位部分,k位右边部分。

为了方便起见,我们把这三部分所对应的数字分别记为a,b,c。

则我们可以把x表示成a*10^(k+1) + b*10^k + c,类似地,把x‘表示成a*10^k + c。

从而很容易地,x+x'可以表示成(11*a+b)*10^k + 2*c,由于题目要求找到满足x+x'=n的x,所以我们只需要把n分成上述式子的形式,找到符合条件的a,b,c即可。

需要注意的是,a,b,c需要满足的条件有:

1、b是0~9的某一数字。

2、所求的b的值可能并不是真正的b的值。

      因为2*c可能大于10^k,从而使得b的值比真正的b的值多1,由于b本身最大是9,加1后最大是10,而a的系数是11,所以进位不会影响a的值。

3、a、b不能同时为0。

      因为当a为0的时候说明k一定在最高位,而一个数的最高位不可能是0(0除外)。

Ps:熟悉了下list的剔除重复元素的用法,呵呵。

#include <list>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
    int n,a,b,c,x;
    list <int> l;
    list <int>::iterator it;
    while(scanf("%d",&n),n)
    {
        l.clear();
        for(int k=1;k<=n;k*=10)
        {
            a = n/k / 11;
            b = n/k % 11;
            if(a + b && b < 10)
            {
                c = (n - 11*a*k - b*k) / 2;
                x = 11*a*k + b*k + 2*c;
                if(n == x)
                    l.push_back(x);
            }
            b--;
            if(a + b && b >= 0)
            {
                c = (n - 11*a*k - b*k) / 2;
                x = 11*a*k + b*k + 2*c;
                if(n == x)
                    l.push_back(x);
            }
        }
        if(l.size()==0)
            puts("No solution.");
        else
        {
            l.sort();
            l.unique();
            it = l.begin();
            printf("%d",*it);
            for(it=++it;it!=l.end();it++)
                printf(" %d",*it);
            printf("\n");
        }
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值