PAT 1084 外观数列

这篇博客介绍了PAT 1084题目的外观数列,阐述了数列的定义,以及如何根据定义推算序列的第N项。博主分享了自己的代码和未满分的原因,并提供了他人的解决方案,强调了代码中添加结束符''的重要性。文章以学习心得和目标结尾,鼓励读者努力学习。
摘要由CSDN通过智能技术生成

1084 外观数列

外观数列是指具有以下特点的整数序列:

d, d1, d111, d113, d11231, d112213111, ...

它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d,所以就是 d1;第 2 项是 1 个 d(对应 d1)和 1 个 1(对应 11),所以第 3 项就是 d111。又比如第 4 项是 d113,其描述就是 1 个 d,2 个 1,1 个 3,所以下一项就是 d11231。当然这个定义对 d = 1 也成立。本题要求你推算任意给定数字 d 的外观数列的第 N 项。

输入格式:

输入第一行给出 [0,9] 范围内的一个整数 d、以及一个正整数 N(≤ 40),用空格分隔。

输出格式:

在一行中给出数字 d 的外观数列的第 N 项。

输入样例:

1 8

输出样例:

1123123111

自己写的代码:总结再代码上的注释(没有得到满分的原因,万一没有输入的话,那就还是会输出一个字符 ’0‘),字符数组可以初始化为 0 ,那就打印不出来任何东西

//使用两个数组来存储结果
//一个存储上一个结果。一个存储下一个结果,最后还要使用strcmp将新的数组赋给老的数组
//需要遍历老的数组 

#include <stdio.h>
#include <string.h>

int main(void){
	char a[100000];
	char b[100000];
	int n;
	int i,j,k=0;
	for(i=0;i<100000;i++){
		a[i]=b[i]='0';
	}
	scanf("%c %d",&a[0],&n);//
	char e;
	for(i=0;i<n-1;i++){//因为前面赋值过了一个,所以只需要赋值n-1个了
		int k=0,cot=0;       //cot统计个数
		b[k++]=a[0];
		e=a[0];
		//循环出了问题 
		for(j=0;a[j]!='0';j++){
			if(e!=a[j]){    //判断前后两个字母是否相同
				b[k++]=cot+'0';
				b[k++]=a[j];
				cot=0;//刷新cot 
			}
			cot++;
			e=a[j];
		}
		b[k++]=cot+'0';
		b[k]='\0';
		strcpy(a,b);		
	}
	printf("%s\n",a);
	
	return 0;
}

 别人的代码:

#include <stdio.h>
int main(){
	int n,i,count;
	char *s1[10000]={0},*s2[10000]={0},*p1,*p2;
	scanf("%s %d",s1,&n);
	for(i=1;i<n;i++){	/* 循环通过第n个字符串 */
		for(p1=s1,p2=s2,count=0;*p1;p1++){//指针指向头部
			count++;
			if(*p1!=*(p1+1)){/* 新字符或结束 */ 
				*p2++ = *p1;/* 记录字符 */
				*p2++ = count+'0';/* 记录计数 */
				count=0;/* 重置计数 */
			}
		}
		strcpy(s1,s2);/* 交换函数 */
	}
	printf("%s\n",s1);
	return 0;
}

2022.7.13

总结:还是比较简单,容易想到思路(可以学习一下上面的代码,思路很好)

思路:按照题目要求直接来做就可以了,需要注意的是,在循环的最后使用strcpy的时候,新的数组需要在后面加上结束符‘\0’,构成字符串!!!

#include <stdio.h>
#include <string.h>

int main(void){
	int n;
	char s[100000],a[100000];
	scanf("%s",s);
	scanf("%d",&n);
	int i,j;

	for(i=0;i<n-1;i++){
		int q=0,k;
		for(j=0;s[j]!='\0';){
			int cot=0;
			a[q++]=s[j];
			for(k=j;s[j]==s[k] && s[k]!='\0';k++)	cot++;
			a[q++]=cot+'0';
			j+=cot;
		}
		a[q]='\0';
		strcpy(s,a);	
	}
	printf("%s\n",s);

	return 0;
}

好好学习,天天向上!

我要考研!        缩小差距!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值