9. 数列描述

发布于:2024-12-21 ⋅ 阅读:(19) ⋅ 点赞:(0)
题目描述:

有一个数列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;
}