寻找从num到1或89的平方和数字链中的所有数并返回

有友友能帮忙看看错哪里了吗?我和同学看了都没找出来问题,但是交不上去啊,救下我吧

img

img

运行结果如下:

img

代码如下:

def numsChain(num):
    chain = []
    while num != 1 and num != 89:
        chain.append(num)
        num = sum(int(digit)**2 for digit in str(num))
    chain.append(num)
    return "->".join(str(n) + "->" + str(n) for n in chain)


num = int(input("请输入一个正整数:"))
chain = numsChain(num)
print(chain)

是不是1和89输出有问题1的输出是1是1->1。89类似

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7732937
  • 除此之外, 这篇博客: 10个实用的数据分析模型,学会思路再也不用啃书了中的 一、用户价值模型 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1、RFM模型

    RFM分析是客户关系分析中一种简单实用客户分析方法,他将最近一次消费、消费频率、消费金额这三个要素构成了数据分析最好的指标,衡量客户价值和客户创利能力。

    RFM分析也就是通过这个三个指标对客户进行观察和分类,针对不同的特征的客户进行相应的营销策略。

    R——最后交易距离当前天数(Recency)
    F——累计交易次数(Frequency)
    M——累计交易金额(Monetary)

    在这三个制约条件下,我们把M值大,也就是贡献金额最大的客户作为“重要客户”,其余则为“一般客户"和”流失客户“,基于此,我们产生了8种不同的客户类型:

    • 重要价值客户:复购率高、购买频次高、花费金额大的客户,是价值最大的用户。
    • 重要保持客户:买的多、买的贵但是不常买的客户,我们要重点保持;
    • 重要发展客户:经常买、花费大但是购买频次不多的客户,我们要发展其多购买;
    • 重要挽留客户:愿意花钱但是不常买、购买频次不多的客户,我们要重点挽留;
    • 一般价值客户:复购率高、购买频次高,但是花费金额小的客户,属于一般价值;
    • 一般保持客户:买的多但是不常买、花钱不多,属于一般保持客户;
    • 一般发展客户:经常买,但是买不多、花钱也不多,属于一般发展客户;
    • 一般挽留客户:不愿花钱、不常买、购买频次不高,最没有价值的客户;

    10个实用的数据分析模型,学会思路再也不用啃书了

     

    下面是我用FineBI做的RFM模型可视化仪表板,可以通过RFM模型对客户的终生价值做一个合理的预估,基于一个理想的客户特征来衡量现实中客户价值的高低,通过此类分析,定位最有可能成为品牌忠诚客户的群体,让我们把主要精力放在最有价值的用户身上。

    10个实用的数据分析模型,学会思路再也不用啃书了

     

    2、波士顿模型

    波士顿模型最初是一个时间管理模型,按照紧急、不紧急、重要、不重要排列组合分成四个象限,以此便于对时间进行有效的管理。

    运用在客户分析中,也就是利用销售额和利润这两个重要指标分为四个象限,对我们的客户进行分组。我们将这两个维度作为横纵坐标轴分为四个象限,将产品或者服务分为下面四种类型:

    10个实用的数据分析模型,学会思路再也不用啃书了

     

    • 明星类:增长率高、占有率高,代表着十分成功的产品,是主打的明星产品;
    • 金牛类:增长率低、占有率高,已经占据了市场但是没有发展空间的产品,属于现金牛产品;
    • 问题类:增长率高、占有率低,说明用户需求高,但是本身产品有问题,需要改进优化;
    • 瘦狗类:增长率低、占有率低,市场不认可的失败产品,需要尽快去除;

    我们如此分类的目的正是要根据波士顿矩阵,将一些没有发展前景和市场潜力的产品尽快淘汰掉,保证明星产品和现金牛产品的份额,从而搭配好产品或者业务的整个市场布局。

    FineBI制作的波士顿模型实际使用:

    10个实用的数据分析模型,学会思路再也不用啃书了

     

    如图所示,每个销售大区与每个销售年份下的客户分布,通过筛选数据,我们得到我们想要的客户信息。而波士顿矩阵则是一个非常有力的工具,可以帮助我们将杂乱无序的东西组块整理,在使用矩阵的的时候,尽量选取纵向和横向毫无关联要素来分析,这样才能发挥矩阵分块整理的作用。

    3、CLV用户生命模型

    我们知道并不是所有的顾客都具备相同的价值,如果企业能够专注于那些可以带来最大未来利益的客户,就可以实现更好的运营。所以企业必须识别出这些客户,CLV是对客户未来利润的有效预测,它还有另外一个名字,叫做LTV (life time value)。

    这里需要特别说明的是,CLV考虑了完整的客户生命周期,包含客户获取和客户流失,也就是它计算的不只是眼前顾客已经产生的价值,还预测了未来价值。

    CLV的计算公式有非常多,有的会非常复杂,主要在流失率这个环节和影响因素就相当多,也有会加上投入成本,价值变化率和利率变化等等。

    比较实用简单的是这种:

    10个实用的数据分析模型,学会思路再也不用啃书了

     

    注意此公式对群体有效,对个体精准度较低,因为个体流失率影响因素太多,而群体流失率却是可以统计的。

    那对于CLV的应用,可以从以下两个模型来看,将企业的最优客户与不值得投入的客户区分出来:

    10个实用的数据分析模型,学会思路再也不用啃书了

     

    4、帕累托模型(二八法则)

    帕累托原则,又称二八原则,是关于效率与分配的判断方法。帕累托法则是指在任何大系统中,约80%的结果是由该系统中约20%的变量产生的。应用在企业中,就是80%的利润来自于20%的项目或重要客户。

    模型的解释:当一个企业80%利润来自于20%的客户总数时,这个企业客户群体是健康且趋于稳固的。 当一个企业80%利润来自大于20%的客户总数时,企业需要增加大客户的数量。当一个企业80%利润来自小于20%的客户群时,企业的基础客户群需要拓展与增加。

    模型的实际使用:如下图我用FineBI制作的某商场品牌商的销售额。

    10个实用的数据分析模型,学会思路再也不用啃书了

     

    一共10家客户,5家客户(50%)提供了80%的销售额,这就说明需要增加大品牌客户数量。

    带来大量销售额的客户必须认真对待和维护,如果客户数量大,尤其需要列出重点客户重点跟进,把有限的精力放在创造利润大的客户上。

    5、漏斗模型

    漏斗模型本质是分解和量化,为了方便大家理解,我这里以营销漏斗模型举例:

    也就是说营销的环节指的是从获取用户到最终转化成购买这整个流程中的一个个子环节,相邻环节的转化率则就是指用数据指标来量化每一个步骤的表现。

    所以整个漏斗模型就是先将一个完整的购买流程拆分成一个个步骤,然后用转化率来衡量每一个步骤的表现,最后通过异常的数据指标找出有问题的环节,然后解决该环节的问题,最终达到提升整体购买转化率的目的,所以漏斗模型的核心思想可以归为分解和量化。

    比如分析电商的转化,我们要做的就是监控每个层级上的用户转化,寻找每个层级的可优化点。对于没有按照流程操作的用户,专门绘制他们的转化模型,缩短路径提升用户体验。

    10个实用的数据分析模型,学会思路再也不用啃书了

     

  • 您还可以看一下 张长志老师的大白话学懂机器学习与推荐系统实战课程中的 016_机器学习模型和算法_线性回归(下)小节, 巩固相关知识点

按照要求,函数只返回结果,由主函数输出结果,其次,1和89要输出为1->1 89->89这种形式的,修改后如下:

def numsChain(num):
    '''
   寻找从num到1或89的平方和数字链中的所有数并将结果返回。
 '''
    nums = [num]
    while num not in [1, 89]:
        num = sum([int(char) ** 2 for char in str(num)])
        nums.append(num)

    return nums


if __name__ == '__main__':
    num = int(input())
    nums = numsChain(num)
    if len(nums)>1:
        print('->'.join([str(num) for num in nums]))
    else:
        print(num,'->',num,sep='')



运行结果:

img

img

以下内容引用CHATGPT、有用望采纳:

这段代码有一些问题:

  1. 在循环中没有更新num的值,导致死循环。
  2. 在计算平方和时,需要将数字拆分成个位数再进行计算,但这里直接用了字符串的操作,会导致结果错误。

以下是修改后的代码示例:

def square_sum(num):
    """
    计算数字的平方和
    """
    res = 0
    while num > 0:
        res += (num % 10) ** 2
        num //= 10
    return res

def get_num_chain(num):
    """
    获取从num到1或89的平方和数字链中的所有数
    """
    chain = [num]
    while num not in [1, 89]:
        num = square_sum(num)
        chain.append(num)
    return chain

result = get_num_chain(145)
print(result)

输出结果为:[145, 42, 20, 4, 16, 37, 58, 89]

这里的get_num_chain函数传入的参数为145,表示从145开始计算平方和数字链,直到最终结果为1或89为止。返回的结果是一个列表,包含了从145到89的所有数字。

给你一个递归的

def numsChain(num):
    s = sum(map(lambda x: int(x) ** 2, str(num)))
    if s == 1 or s == 89:
        return str(num) + '-->' + str(s)
    else:
        return str(num) + '->' + str(numsChain(s))
    
x = numsChain(89)
print(x)


以下答案由GPT-3.5大模型与博主波罗歌共同编写:
题目描述:

定义一个数字链如下:对于任意正整数n,将每个数字的平方相加,得到一个新的数字n1,并用n1取代n。重复这个过程直到数字链稳定于1或89。例如,如果把44作为起始数字,此数列将如下展开:

44 → 32 → 13 → 10 → 1 → 1
85 → 89 → 145 → 42 → 20 → 4 → 16 → 37 → 58 → 89

因此,从44和85开始,会到达一个稳定的数字1或89。在下面这个范围(1 ≤ num < 10^7)内,有多少个数字能够到达数字89?

示例:

输入:n = 10
输出: 1

解析:输入的从10开始的数字链如下:
10 → 1
因此存在一个数字能最终抵达数字 1。

算法思想:

暴力循环即可,从 num 到 1 或 89 的平方和数字连中遍历,遇到已经出现过的数字就停止递归,返回是否到了 89,最后统计出有多少个数字能够到达数字 89。

代码实现(Python):

class Solution:
    def squareSum(self, n):
        """
        获取一个数字的各个位数的平方和
        """
        res = 0
        while n > 0:
            res += (n % 10) ** 2
            n //= 10
        return res

    def isSumHappy(self, n):
        """
        是否为快乐数字
        """
        visited = set()  # 记录已经访问过的数字
        while n not in visited:
            visited.add(n)
            n = self.squareSum(n)
            if n == 1:
                return False
            if n == 89:
                return True
        return False

    def getHappyDigitCnt(self, num: int) -> int:
        if num <= 0:
            return 0
        cnt = 0
        for i in range(1, num+1):
            if self.isSumHappy(i):
                cnt += 1
        return cnt

时间复杂度分析:

根据题意,需要将数字分别求出其平方和数字链,一个数字最多经过快乐算法链 1 -> 10 -> 13 -> 10 -> ... 中的 9 次运算,所以时间复杂度为 O(81 * logN),其中 logN 为数字的位数,也就是数字的大小,81 为 平方和的上限。
如果我的回答解决了您的问题,请采纳!

Python函数部分2

可以借鉴下
https://blog.csdn.net/weixin_46894431/article/details/107929522