考虑我们的边一定是从小的数连接到大的数,那么这张图不会有环,即有向无环图.那么我们直接模拟移动,
当u < v时,u往上移动,反之v往上移动,
直到到出现 max(u,v) > n 或者 u = v 结束。过程类似树上求最近公共祖先(LCA)。
如果u和v连通,还要判断是否和n也连通。
n , u , v = map(int, input().split())
ans = 0
while u != v and max(u,v) <= n:
    if u < v:
        u += sum([int(x) for x in str(u)])
    else:
        v += sum([int(x) for x in str(v)])
    ans += 1
if u == v:
    while u < n:
        u += sum([int(x) for x in str(u)])
    if u == n:
        print(ans)
    else:
        print("NO")
else:
    print("NO")
OJ会员可以通过点击题目上方《已通过》查看其他通过代码来学习。
小明有一个数字n,但是他依旧不满足,他想要让自己的数字变得更多!
对于他已有的整数n,如果存在另一个整数x、使得其全部数位的和加上它自己恰好为n,那么这个数字就是“可爱数字”,连一条从n到x的双向边。
对于连接而成的图,直接输出两个数字之间至少需要经过几条边,或报告这两个点不连通。
在一行上输入三个整数
n,u,v(1≤n≤106;1≤u,v≤n;u=v)代表小明的初始数字和询问的两点。
询问的两点。
如果可以从数字点u到达数字点v,在一行上输出一个整数,代表最短需要经过的边数;
否则,直接输出NO.
输入
13 5 13
输出
3
说明
13唯一的可爱数字为11(11+1+1=13);
11唯一的可爱数字为10(10+1=11);
10唯一的可爱数字为5(5+5=10);
5很孤单,它没有其他的可爱数字了;
所以5到13至少需要经过3条边。
输入
10 3 4
输出
NO