看完题,没啥思路。
网上的大牛讲解如下:
假设删掉第k位为数字B,前面的数字段为A,后面的数字段为C,则有:
n=A*10^(k+1) + B*10^k + c
m=A*10^k + c
N=n+m=(11A+B)*10^k + 2c
有:A=N/10^k/11,B可能被2c进位,故分为两种情况:
1. B=N/10^k – 11A && 2c < 10^k//2c未进位
2. B=N/10^k – 11A – 1 && 2c >=10^k //2c进位
遍历k的可能值(0到N的位数)便可将所有n求出,排序输出即可。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<queue>
#define PI3.1415926535897932384626433832795
using namespace std;
int s[500];
int cmp(const void*a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int n,k,i;
int a,b,c,num;
while(scanf("%d",&n),n)
{
num=0;
for(k=1;k<=n;k*=10)
{
c=n/k/11;
b=n/k-11*c;
if((b!=0 || c!=0)&& b<10)
{
a=(n-(11*c+b)*k)/2;
if(11*c*k+b*k+2*a==n)
{
num++;
s[num]=c*k*10+b*k+a;
//printf(" %d",s[num]);
}
}
b--;
if((b!=0||c!=0)&& b>=0)
{
a=(n-(11*c+b)*k)/2;
if(11*c*k+b*k+2*a==n)
{
num++;
s[num]=c*k*10+b*k+a;
//printf(" %d",s[num]);
}
}
}
if(num==0)
printf("Nosolution.\n");
else
{
qsort(&s[1],num,sizeof(s[0]),cmp);
printf("%d",s[1]);
for(i=2;i<=num;i++)
{
if(s[i]!=s[i-1])
printf(" %d",s[i]);
}
printf("\n");
}
}
}