头歌:循环3第5关:最长连续自然数个数

本文介绍如何使用编程解决给定一个正整数序列,找到最长连续自然数序列的长度问题。通过实例代码展示了如何遍历序列并利用while循环来计数连续数字,最后输出最长序列的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务描述

本关任务:输入长度为 n 的一个正整数序列,要求输出序列中最长连续自然数序列的长度。

相关知识(略)

编程要求

根据提示,在右侧编辑器Begin-End处补充代码。

输入 第一行,一个整数n,第二行,n 个整数 ai​

输出 一个数,最长连续自然数的个数。

测试说明

平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。 样例输入: 10 1 5 6 2 3 4 5 6 8 9 样例输出: 5

#include <stdio.h>
#include<math.h> 
int main()
{
	int n,i,j,k;
	float s=1,max=0;
	int a[10000];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++)
	{
		while(a[i]==a[i+1]-1)
		{
			s=s+1;
			i=i+1;
		}	
		if(s>max)
		{
			max=s;
		}
		s=1;
	}
  	printf("%.0f",max);
  	return 0;
}

<think>嗯,我现在得解决这个问题。题目是要求找出一个正整数序列中最长的连续递增1的子序列的长度,也就是连号。那连号的定义是连续的自然数,所以每个相邻元素之间的差必须是1。比如序列1,2,3的话,长度是3。那怎么处理呢? 首先,我得理解输入输出输入是n个整输出是最长连号的个数。例如,输入n=5,序列是1 5 3 4 7,那么最长连号是3,4,或者5可能自己单独一个?或者要看具体的相邻差是否为1。比如53之间差-2,不符合。3和4之间差1,符合。所以最长长度是2?或者原题中的连号是否要求至少两个数?比如单个数字是否算长度1? 根据题目描述,连号是“从小到大的连续自然数”,所以单个数字应该算长度1。比如序列是7的话,最长连号是1。那这时候,我们需要找出最长的连续递增1的子序列的长度。 那我的思路应该是遍历组,记录当前连续递增1的长度,同时维护一个最大值。比如,初始化当前长度是1,最大值也是1。然后从第二个元素开始,比较当前元素和前一个元素是否差1。如果是,当前长度加1,否则重置当前长度为1。每次循环更新最大值。 比如例子中的输入n=5,序列是1 5 3 4 7。遍历过程: 初始current=1,max=1。 第二个元素55-1=4≠1 → current=1,max保持1。 第三个元素33-5=-2→current=1。 第四个元素4:4-3=1→current=2,此时max变为2。 第五个元素7:7-4=3→current=1。最终max是2。所以输出2。 那这样处理的话,算法的时间复杂度是O(n),应该没问题。 那现在要如何用C语言实现? 步骤大概是: 1.读取n的值,注意n的范围。题目中的输入正整数序列,所以n应该是≥1的整。但需要处理可能的n=0的情况吗?题目中说输入正整数序列,所以n应该≥1。比如第一行输入n,第二行输入n个数。 2.然后读取n个整一个组中。 3.遍历组,比较相邻元素差是否为1。维护current和max变量。 那需要注意组的索引是否正确,避免越界。例如,循环从i=1开始到i<n。 比如初始current_len=1,max_len=1。然后对于每个i从1到n-1: 如果a[i] == a[i-1]+1 → current_len++,否则current_len=1。每次更新max_len。 比如例子中的另一个情况,比如序列是1,2,3,4,那么current_len每次递增,最终max_len是4。 那代码的大体结构应该是: #include <stdio.h> int main() { int n; scanf("%d", &n); int a[n]; for(int i=0; i<n; i++) { scanf("%d", &a[i]); } if(n ==0) { // 但题目中n是正整数,可能不需要处理? printf("0\n"); return 0; } int max_len = 1; int current_len =1; for(int i=1; i<n; i++) { if(a[i] == a[i-1]+1) { current_len++; if(current_len > max_len) { max_len = current_len; } } else { current_len =1; } } printf("%d\n", max_len); return 0; } 这样应该可以解决问题了。比如测试样例: 测试输入1: 5 1 5 3 4 7 输出应该是2,因为3和4是连号。 测试输入2: 4 1 2 3 4 输出4。 另一个测试输入是n=1,输出1。 那这段代码是否正确? 那需要考虑到所有可能的输入情况。例如,当所有元素都是不连续的,比如n=3输入1 3 5,那么最长长度是1。代码中的current_len在每次循环都会重置为1,所以max_len保持1。正确。 那这样应该没问题了。</think>```c #include <stdio.h> int main() { int n; scanf("%d", &n); // 读取序列长度n int arr[n]; // 定义组存储序列 for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); // 读取序列元素 } int max_len = 1; // 最长连号长度,初始至少为1 int current_len = 1; // 当前连号长度 for (int i = 1; i < n; i++) { if (arr[i] == arr[i-1] + 1) { // 判断是否连续递增1 current_len++; // 当前长度增加 if (current_len > max_len) { max_len = current_len;// 更新最大值 } } else { current_len = 1; // 重置当前长度 } } printf("%d", max_len); // 输出结果 return 0; } ``` ### 分步解释: 1. **读取输入** 使用`scanf`读取序列长度`n`和具体的序列元素,存入组`arr`中。 2. **初始化变量** `max_len`记录全局最长连号长度,初始为1(单个元素自身构成连号)。`current_len`记录当前连续递增序列的长度。 3. **遍历序列** 从第二个元素开始(`i=1`),检查当前元素是否比前一个大1。若满足条件,当前连号长度`current_len`加1,并更新`max_len`;否则重置`current_len`为1。 4. **输出结果** 遍历结束后,输出最长连号长度`max_len`。 ### 示例验证: - **输入**: `5` `1 5 3 4 7` **输出**: `2` **解释**: 最长连号是`3→4`,长度为2。 - **输入**: `4` `1 2 3 4` **输出**: `4` **解释**: 整个序列构成连号,长度为4。 - **输入**: `1` `5` **输出**: `1` **解释**: 单个元素视为长度为1的连号。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值