Kolakoski序列及应用拓展

Kolakoski序列是一种自生成的无限序列,根据给定的整数组生成不同的序列。本文探讨了如何根据不同的起始整数组构造Kolakoski序列,并提供了输入两个正整数n和m以及m个正整数a[]时,生成和追踪Kolakoski序列的解题思路,其中涉及到序列的循环和更新规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
Kolakoski序列是个自生成的无限序列。
例如,当给定的整数组为[1,2]时,Kolakoski序列是这样的:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1……];
对于其他给定的整数组,同样可以用类似的方法构造Kolakoski序列,例如给定整数组[2,3]时,
[2,2,3,3,2,2,2,3,3,3,2,2,3,3,2,2,3,3,3,2,2,2,3,3,3,2,2,3,3……]
给定整数组[2,1,3,1]时,构造得到如下:
[2,2,1,1,3,1,2,2,2,1,3,3,1,1,2,2,1,3,3,3,1,1,1,2,1,3,3,1,1……]

输入两个正整数n,m.
输入m个正整数a[]
*/
/*
解题思路: 首先给定a数组,b数组中第一个数字肯定和a数组第一个数字相同,此时需要追踪b数组下标所对应的数字
记住这个长度以便后边循环,例如,b[1]为2,那么b[2]肯定也为2,此时需要循环输出,然后更新a数组的序列,依次循环
这里需要注意的是当a数组到达最后一个数字时,需要从头开始继续循环。
*/

#include<iostream>
using namespace std;

int main()
{
    int n,m;  //n为要输出多少项序列,m为给定的整数组的长度
    cin>>n>>m;

    int *a = new int[m];  //输入给定的整数组
    int *b = new int[n];  //将要输出的Kolakoski序列

    for(int i = 0;i<m;i++)
    {
        cin>>a[i];
    }
    int index = 0;
    int slow = 0;
         for(int i = 0; i < n;) 
         {
            b[i] = a[index];  
            int num = b[slow++];  //需要记住b数组的序列大小,重复输出数字
            for(int j = num;j>0;j--)
            {
                b[i++] = a[index];  //b数组存放重复的数字,num决定有几个相同的数字
            }
            index++; //相同的循环完之后,a数组中的数字需要往后走继续循环
            if(index == m)  //a数组始终循环
                index = 0;
        }

        for(int i = 0;i<n;i++)
          cout<<b[i]<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值