2021-09-24:给定一个正整数 n ,输出的第 n 项。前五项如下:1:1。2:11。3:21。4:1211。5:111221。第一项是数字 1 。描述前一项,这个数是 1 即 “ 一 个 1

本文介绍了一种使用Go语言通过递归方法实现看说序列(Look-and-say sequence)的算法。看说序列从数字1开始,后续每一项都是对前一项的描述。例如,第一项是1,第二项描述为“一个1”即11,第三项描述为“两个1”即21等。文中提供了一个完整的Go语言实现示例。

2021-09-24:给定一个正整数 n ,输出的第 n 项。前五项如下:1:1。2:11。3:21。4:1211。5:111221。第一项是数字 1 。描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”。描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 “21”。描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 “1211”。描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 “111221”。返回第N项的字符串。

福大大 答案2021-09-24:

自然智慧。递归。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    ret := countAndSay(5)
    fmt.Println(ret)
}

func countAndSay(n int) string {
    if n < 1 {
        return ""
    }
    if n == 1 {
        return "1"
    }
    last := countAndSay(n - 1)
    ans := make([]byte, 0)
    times := 1
    for i := 1; i < len(last); i++ {
        if last[i-1] == last[i] {
            times++
        } else {
            ans = append(ans, []byte(fmt.Sprintf("%d", times))...)
            ans = append(ans, []byte(fmt.Sprintf("%c", last[i-1]))...)
            times = 1
        }
    }
    ans = append(ans, []byte(fmt.Sprintf("%d", times))...)
    ans = append(ans, []byte(fmt.Sprintf("%c", last[len(last)-1]))...)
    return string(ans)
}

执行结果如下:
图片


左神java代码

要使用C语言解决这个问题,我们可以通过一个简单的算法来实现,具体步骤如下: 1. 初始化最小和为n(因为n本身就是一个正整数,满足条件)。 2. 从最小的因子开始尝试,即从2开始,直到n的平方根(因为如果n有一个因子大于它的平方根,那么定还有一个小于或等于它的平方根)。 3. 对于每个因子i,检查n是否能够被i整除。如果可以,那么将i和n/i分别加入到因子集合中。 4. 对因子集合中的每个因子,继续按照上述过程进行分解,直到不能再分解为止。 5. 在所有的分解组合中,找到因子和最小的种情况。 这里需要注意,题目要求求的是正整数的最小和,而不是分解因子的个最少。因此,可能需要遍历所有可能的分解组合来找到因子和最小的情况。 下面是一个简单的C语言代码示例来解决这个问题: ```c #include <stdio.h> #include <math.h> // 函用于求解正整数n的最小和 int minSumFactors(int n) { int minSum = n; // 初始化最小和为n for (int i = 2; i <= sqrt(n); ++i) { while (n % i == 0) { n = n / i; // 分解因子i minSum = minSum > i + n ? i + n : minSum; // 更新最小和 } } if (n > 1) { minSum = minSum > 1 + n ? 1 + n : minSum; // 如果n还大于1,说明n是质,直接加到最小和中 } return minSum; } int main() { int n; printf("请输入一个正整数n:"); scanf("%d", &n); printf("最小和为:%d\n", minSumFactors(n)); return 0; } ``` 这段代码的核心是`minSumFactors`函,它会不断尝试分解给定正整数`n`,并更新最小和。最后,`main`函会读取用户输入的正整数,并调用该函输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福大大架构师每日一题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值