前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用欧拉计划学Rust编程(第92题)

用欧拉计划学Rust编程(第92题)

作者头像
申龙斌
发布2019-10-08 17:40:56
4110
发布2019-10-08 17:40:56
举报

第92题 平方数字链

题目描述:

将一个数的所有数字的平方相加得到一个新的数,不断重复直到新的数已经出现过为止,这构成了一条数字链。

例如,

44 → 32 → 13 → 10 → 1 → 1

85 → 89 → 145 → 42 → 20 → 4 → 16 → 37 → 58 → 89

可见,任何一个到达1或89的数字链都会陷入无尽的循环。更令人惊奇的是,从任意数开始,最终都会到达1或89。

有多少个小于一千万的数最终会到达89?

解题思路:

1)各位数字的平方和

fn square_sum(n: u64) -> u64 {
    n.to_string()
     .chars()
     .map(|x| x.to_digit(10).unwrap().pow(2) as u64)
     .sum::<u64>()
}

可以用整数运算提高效率。

fn square_sum(n: u64) -> u64 {
    let mut m = n;
    let mut s = 0;
    while m != 0 {
        s += (m % 10) * (m % 10);
        m /= 10;
    }
    s
}

2)循环求解

fn main() {
    let mut count = 0;
    for i in 1..10_000_000 {
        if square_chain_arrive(i) == 89 {
            count += 1;
        }
    }
    println!("{}", count);
}

fn square_chain_arrive(n: u64) -> u64 {
    let mut x = n;
    while x != 1 && x != 89 {
        x = square_sum(x);
    }
    x
}

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 申龙斌的程序人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档