两道编程算法题

给一个区间, 从a到b,每个数字进行以下计算:
每个相邻的数字相减求绝对值,例如813,会变成72。但如果结果不是个位数,就要重复之前的计算,即72–>5。
就这样求解a到b之间的每个数,并统计结果为7的数字个数。

想达到7,两位数里只有18,81,92,29,70,07,但要注意,分解完毕后,首位数字为0的需要踢出lucky数字的队伍。这是解题思路。

  1. 首先需要找出有哪些两位数可以相减得到0-9数字,列成字典,方便后续使用,例如7的数对存储为{7:{1:8,8:1,9:2,2:9,7:0,0:7}}。
  2. 以7为根节点,根据表找到能得到7的两位数,作为7的分支。
  3. 继续查表,对每个二级分支的值做拆分,例如18中需要找到能合成1和8的数对,且1的数对左侧等于8的数对的右侧。
  4. 接下来就是无穷无尽的分支了,但要保证拆分时左侧数对的右数等于右侧数对的左数。
  5. 这样就能得到一个分支不定的树了,第n层对应了n位数中的所有lucky数字,当然,其中肯定有首位数字为0的值,统计时需要除掉。

给两个数字a和b,要求得到x,y,z三个不同的数字,使x+y+z=a,且x,y,z两两之间的的最大公约数是b。只需得到一个解就好。

引入三个数字w,p,q:
x = bw, y = bp, z = bq.
所以w+p+q=(a/b)
如果a/b有余数,就无解。
接下来要求w,p,q两两之间的最大公约数是1,且和为a/b.
这个问题相当于找到三个互质数,约束是和为固定值。
首先很明显,wpq最小也得是123.所以如果a/b<6,就无解.
接下来可以拆开看这个问题。如果n=a/b是偶数,很简单,使w=1,p=n/2,q=n/2-1。如果是奇数,有些麻烦,但我们知道,一个偶数(除了2)是是两个质数的和,虽然没被证实,但在范围内都是证实的,所以依然使w=1,这样n-1就是偶数,然后循着质数表寻找能使p+q=n-1的质数对。

你可能感兴趣的:(两道编程算法题)