数论-整数对

110 阅读1分钟

整数对

考虑一个不含前导零的正整数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;
}