整数对
考虑一个不含前导零的正整数X,把它去掉一个数字以后得到另一个数Y。输入X+Y的值N(1<=N<=10^9),输出所有可能的等式X+Y=N。例如N=34有两个解:31+3=34;27+7=34。
思路:
1.记N的10进制表示形式的长度为L.
2.设从x右边数的第i(0<=i<L)位删除数字d(0<=d<10)得到Y(如图)
3.记X=a10^(i+1)+d10^i+b,(b<10^i)^,则Y=a10^i^+b,且X+Y=N;由此可得11a10^i^+d10^i+2b=N; 4.遍历所有的i和d; 5.固定i和d之后,求不定方程11a10^i^+2b=N-d10^i^,所有满足0<a<10^i^且0<=b<10^i(注意当i=L-1时,a恒等于0)整数解(a,b)并带入3中解出X,Y即可。
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
int N;
cin>>N;
int L=0,tem=N;
while (tem)
{
L++;
tem/=10;
}
for (int i=0;i<L;i++ )
{
for (int d=0;d<10;d++ )
{
for (int b=0;b<pow(10,i);b++ )
{
if((int)(N-d*pow(10,i)-2*b)%(11*(int)pow(10,i))==0)
{
int a=(N-d*(int)pow(10,i)-2*b)/(11*pow(10,i));
if(i==L-1)
{
a=0;
cout<<"X:"<<a*pow(10,i+1)+d*pow(10,i)+b<<"Y:"<<a*pow(10,i)+b<<"\n";
}
else
{
if(a>0)
{
cout<<"X:"<<a*pow(10,i+1)+d*pow(10,i)+b<<"Y:"<<a*pow(10,i)+b<<"\n";
}
}
}
}
}
}
return 0;
}