9. 数列描述

news/2024/12/22 3:22:58/
题目描述:

有一个数列a[N] (N=60),从a[0]开始,每一项都是一个数字。数列中a[n+1]都是a[n]的描述。其中a[0]=1。

规则如下:

a[0]:1

a[1]:11(含义:其前一项a[0]=1是1个1,即“11”。表示a[0]从左到右,连续出现了1次“1”)

a[2]:21(含义:其前一项a[1]=11,从左到右:是由两个1组成,即“21”。表示a[1]从左到右,连续出现了两次“1”)

a[3]:1211(含义:其前一项a[2]=21,从左到右:是由一个2和一个1组成,即“1211”。表示a[2]从左到右,连续出现了1次“2”,然后又连续出现了1次“1”)

a[4]:111221(含义:其前一项a[3]=1211,从左到右:是由一个1、一个2、两个1组成,即“111221”。表示a[3]从左到右,连续出现了1次“1”,连续出现了1次“2”,连续出现了两次“1”)

请输出这个数列的第n项结果(a[n],0≤n≤59)。

输入描述:
数列的第n项(0≤n≤59):
4
输出描述:
数列的内容:


111221

补充说明:

示例1
输入:

4


输出:

111221
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/huaweiod123/article/details/131621487

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.有一个数组,其中每一项的内容是对前一项的描述

2.第一项a[0]为1,第二项是a[1] = 11,代表1个1,第三项a[2] = 21代表2个1

3.输入一个数字,表示第n项

4.求输出第n项的内容

二、解题思路

1.我们可以使用暴力的方式,计算出从0到n每一项的内容

2.如何计算呢,我们需要从后往前遍历,定义两个变量一个是int count = 0;

一个是int num = 0;

3.使用count记录某一个num出现的次数,然后我们求出num的位数,

int temp = a[i - 1];

int a[i] = 0;

while(temp > 0){

num = temp % 10;

while(temp % 10 == num){

temp / = 10;

count++;

}

int snum = 10;

while(snum <= num) snum *= 10;

4.我们需要添加到结果的数字就是int add = snum * count + num;

if(a[i] > 0){

snum = 10;

while(a[i] >= snum) snum *= 10;

a[i] += snum * add;

}else {

a[i] = add;

}

}

5.然后我们将结果输出就可以了

三、具体步骤

使用的语言是C

#include <stdio.h>int main() {int n;scanf("%d", &n);int a[n];a[0] = 1;for(int i = 1; i < n; i++) {int temp = a[i - 1];a[i] = 0;while(temp > 0) {int count = 0;int num = 0;num = temp % 10;printf("num is %d\n", num);while(temp % 10 == num) {count++;temp /= 10;}int snum = 10;while(snum <= num) snum *= 10;int add = snum * count + num;printf("add is %d\n", add);snum = 1;while(snum <= a[i]) snum *= 10;a[i] += add * snum;printf("a[%d] is %d\n", i, a[i]);}}printf("%d\n", a[n]);return 0;
}

但是实际使用的时候如果n过大的时候因为int类型最大值是2147483647,超过最大值会报错,所以要使用字符串来计算。

#include <stdio.h>
#include <string.h>int main() {int n;scanf("%d", &n);char a[n][1000000];strcpy(a[0], "1");printf("a[0] = %s\n", a[0]);for(int i = 1; i < n; i++) {int len = strlen(a[i - 1]);printf("length of a[%d - 1] is %d\n",i,len);int index = 0;for(int j = 0; j < len; j++) {char num = a[i - 1][j];int count = 0;while(a[i - 1][j] == num){count++;j++;}j--;a[i][index++] = count + '0';a[i][index++] = num;}a[i][index] = '\0';}printf("%s\n", a[n - 1]);return 0;
}

如果记录每个字符串依旧内存过大

只记录两个数字

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {int n;scanf("%d", &n);char* a = malloc(sizeof(char) * 100000000);char* b = malloc(sizeof(char) * 100000000);strcpy(a, "1");//printf("a[0] = %s\n", a);for(int i = 1; i < n; i++) {int len = strlen(a);//printf("length of %d is %d\n",i,len);int index = 0;for(int j = 0; j < len; j++) {char num = a[j];int count = 0;while(a[j] == num && j < len){count++;j++;}j--;b[index++] = count + '0';b[index++] = num;}b[index] = '\0';strcpy(a, b);free(b);b = malloc(sizeof(char) * 100000000);}printf("%s\n", a);free(a);free(b);return 0;
}


http://www.ppmy.cn/news/1557094.html

相关文章

electron-vite【实战系列教程】

创建项目 https://blog.csdn.net/weixin_41192489/article/details/144442262 安装必要的插件 UI 库 element-plus npm install element-plus --save安装 element-plus 图标 npm install element-plus/icons-vue安装插件 – 自动注册组件 vs 自动导入框架方法 npm install -…

HarmonyNext使用ListItemGroup添加头部 布局,头部布局底部留很大空白

今天使用ListItemGroup添加头部布局的时候&#xff0c;发现底部留下很多空白 头部布局使用的是相对布局RelativeContainer 错误代码如下&#xff1a; import { CommonConstants } from "ohos/utils/src/main/ets/common/CommonConstants"; import { DisPlayInfo } …

启动打印服务提示:Http端口已被使用,请修改

分销AV 10.0.0及其以上版本启动打印服务提示&#xff1a;Http端口已被使用&#xff0c;请修改。该如何处理&#xff1f; 一、先将打印服务退出,电脑桌面右下角任我打印服务操作退出。 二、到打印管理器安装目录\print下找到CONFIG文件&#xff0c;用记事本打开后&#xff0c;将…

ThreadLocal数据结构、内存泄漏分析

文章目录 ⚽ThreadLocal&#x1f389;入门案例&#x1f388;ThreadLocal在线程中怎么存储的&#x1f397;为什么会造成内存泄漏&#xff1f;&#x1f383;ThreadLocalMap的key使用强引用和弱引用有什么区别呢&#xff1f;&#x1f514;补充说明Java中引用类型分类内存泄漏和内存…

技术分享 —— JMeter接口与性能测试实战!

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

Redis——缓存双写一致性问题

文章目录 1、情况描述2、缓存双写一致性2.1 情况讨论2.2 双检加锁2.3 数据库和缓存一致性的几种更新策略。 总结 1、情况描述 默认不存在缓存雪崩和缓存击穿情况。首先Java先查询redis&#xff0c;若redis中存在数据则直接返回数据。若redis中不存在数据&#xff0c;需要查询my…

包子凑数(2017年蓝桥杯试题H)

【问题描述】 小明几乎每天早晨都会在一家包子铺吃早餐&#xff0c;他发现这家包子铺有N种蒸笼&#xff0c;其中第i种蒸笼恰好能放Ai(i为下标)个包子。每种蒸笼都有非常多个&#xff0c;可以认为是无限笼。 每当有顾客想买X个包子。卖包子的大叔就会迅速选出若干笼包子&#xf…

Git Rebase分支合并

Git Rebase 的应用场景&#xff0c;包括如何合并多 次提交记录和分支合并 // 1.分支合并 从master切一个开发分支 feature1, git checkout -b feature1 // 2.代码开发完提交代码完后&#xff0c;回到master拉取最新代码 git checkout master git pull // 3.回到feature1 进行代…