题目描述:
有一个数列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;
}