C语言规律数列求通项

求解答下题:

一个数列第0项是1,第n项是对第n-1项的描述,即第一项为1 1表示前一项一个1,第2项为21表示前一项2个1,第3项为1211表示前一项1个2,1个1.求数列第k项

本人思路大致如下,不知道有什么问题,请大家帮忙看看

#include 
#include 

int main()
{
    char b[3];
    char c[1000] = {"1"};
    char a[1000];
    int k;
    scanf("%d", &k);

    int j = 1;
    char *p = &c[0];
    int l = strlen(c);

    while (k > 0)
    {
        while (*p != '\0')
        {
            while ((*p == *(p + j)) && j < l)
            {
                j++;
            }
            b[0] = j + 1;
            b[1] = *p;
            strcat(a, b);
            p = &c[j + 1];
            j = 1;
        }
        memset(c, '\0', sizeof(c));
        for (int i = 0; a[i] != '\0'; i++)
        {
            c[i] = a[i];
        }
        memset(a, '\0', sizeof(a));
        p = &c[0];
        k--;
    }

    printf("%s", c);
    return 0;
}

望采纳


在这段代码中,程序的逻辑并不是很清晰,且存在一些问题。

  • 首先,您可以使用一个循环来实现第k项的计算,在循环内部,使用一个变量来记录当前的数字,然后遍历数列,寻找连续的相同的数字,并更新计数器,最后将计数器的值添加到结果字符串中。

  • 其次,在处理字符串时,您可以选择使用字符串函数库中的函数,例如strcat、strlen和memset,来更方便地处理字符串。

  • 此外,在处理字符串时,您需要注意一些细节,例如在更新字符串时,需要清空原有的字符串,以防止其中的旧数据干扰新的计算。

综上,下面是一个改进的程序:


#include <stdio.h>
#include <string.h>

int main()
{
char b[3];
char c[1000] = {1}; // 修改第0项的初始值
char a[1000];
int k;
scanf("%d", &k);

int j = 1;
char *p = &c[0];
int l = strlen(c);

while (k > 0)
{
    while (*p != '\0')
    {
        while ((*p == *(p + j)) && j < l)
        {
            j++;
        }
        b[0] = j + 1;
        b[1] = *p;
        strcat(a, b);
        p = &c[j + 1];
        j = 1;
    }
    memset(c, '\0', sizeof(c));
    for (int i = 0; a[i] != '\0'; i++)
    {
        c[i] = a[i];
    }
    memset(a, '\0', sizeof(a));
    p = &c[0];
    k--;
}

printf("%d", c);  // 修改输出方式
return 0;
}