Pairs of Integers

【原题链接】

【题意说明】

本题要求给定一个数10=< N <=10^9,把它分成两个数的和,要求第1个数的位数要比第2个数要多1位,且第第2个数必需是由第1个数去掉某位数所得到的数,且第2位数的最高位可以是0。对于给定的数,请输出所有可能的方案数!

【问题分析】

由于是要把一个数分成两个数的和,理论上可以把这个数平均分成两个部分,然后让一个数增加,计算出另一个数,然后判断这个数是否符合要求(即是否比原来的数少一位)。

但显然这样做实际是行不通的,时间复杂度太高!这里我们需要进一步分析所分两个数的相互关系:

假定第1个数的表示形式为:X*10^t+y*10^(t-1)+z,那么第2个数的构成形式则可表示为:

(1) X*10^t+y*10^(t-1)(此时z为个位数,显然t=1)

(2) X*10^t+z(去掉中间那一位数)

(3) y*10^(t-1)+z(此时x为个位数)

这于这三种情况,两数之和为:

(1)2*x*10^t+2*y*10^(t-1)+z=N,由于此是t=2,显然可得z=N%10,这样就可以得到2*x*10 +2*y=(N-z)/10 -->(显然此时当(n-z)/10是偶数才有解)10*x+y=(n-z)/10/2 --> y=(n-z)/10/2%10,x=(n-z)/10/2/10;

(2)2*x*10^t+y*10^(t-1)+2*z=N,此时情况较多,可以从t=2枚举,直到2*10^t大于N为止;

(3)x*10^t+2*y*10^(t-1)+2*z=N,此时也需要按(2)方式来枚举t,找出满足要求的方案。

另外,这里需要注意的是当N是两位数时的情况,也就可以把这里的t看作成从1开始,且z=0的情况来处理。

这样对所有生成的方案,把第1个数从小到大排序,去掉重复的,即可得到需要的结果。

原文地址:https://www.cnblogs.com/ahmasoi/p/2748697.html