题目链接: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;
}