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