最长数字序列
最长数字序列
一、目的
-掌握字符判断
-掌握getline的用法
二、实验内容与设计思想
最长数字序列
输入一个字符串,求该字符串中最长连续数字序列出现的起始位置及其长度。
输入格式:
输入一个字符串,可包含空格。
输出格式:
输出内容:最长数字序列起始位置和长度空格隔开。输出尾部不能有空格。输入空串,输出"NULL"
输入样例:
123ab12345a
输出样例:
5 5
题目分析:
代码重点在于判断条件的重复
函数相关伪代码
1.getline(cin,s);
2.if(s.empty())
| cout<<"NULL";
| return 0;
3. for(i=0;i<s.size();i++)
| if(s[i]>='0'&&s[i]<='9')
|| if(d==0)
||| f=i;
|| d++;
|else
||if(d>a)
|||a=d;
|||b=f;
||d=0;
4. if(d>a)
|a=d;
|b=f;
5.if(a==0){
|cout<<"NULL";
else
|cout<<b<<" "<<a;
函数代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
getline(cin,s);
if(s.empty()){
cout<<"NULL";
return 0;
}
int a=0,b=-1,d=0,f=-1,i;
for(i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9'){
if(d==0){
f=i;
}
d++;
}else{
if(d>a){
a=d;
b=f;
}
d=0;
}
}
if(d>a){
a=d;
b=f;
}
if(a==0){
cout<<"NULL";
}else{
cout<<b<<" "<<a;
}
return 0;
}
三、实验使用环境
以下请根据实际情况编写
- 操作系统:Windows 11专业版
- 编程语言:C++
- 开发工具:[Visual Stdio 2022]
四、实验步骤和调试过程
最长数字序列
本机运行截图
运行分析
输入需要检查的字符串,以回车号表示输入结束
输出字符串中最长数字串的个数和位置,需要以空格来间隔
五、实验小结
遇到的问题及解决方法:
- 问题:判断逻辑有问题
- 解决方法:修改代码
实验体会和收获:
代码用于在给定的字符串中找出最长连续数字序列的起始位置及其长度,同时还要单独处理输入为空串的情况。
首先,通过getline(cin, s)(用getline而不是cin,是因为题目说过会有空格存在,cin遇到空格就会自动结束)获取用户输入的字符串,并使用if(s.empty())判断输入是否为空串,若为空则输出 "NULL" 并结束程序。接着,声明变量a、b、d、f,分别用于记录最长数字序列的长度、起始位置、当前数字序列长度和当前数字序列起始位置。
然后,通过for循环遍历字符串,如果当前字符为数字(s[i]>='0'&&s[i]<='9',因为是字符串输入,需要用‘’来表示字符),且先判断当前数字序列长度d是否为 0,是则记录当前位置为起始位置f=i,并将d加 1;否则仅将d加1(不是起始位)。若当前字符不是数字,结束,判断当前d是否大于已记录的最长长度a时,是则更新a和b分别为d和f,并将d重置为 0(重新计算)。
循环结束后,还需额外判断最后一段数字序列的情况(防止最后几个字符到结束都为数字,且最长),若最后一段数字序列长度d大于a,则更新a和b。最后,根据a是否为 0 判断字符串中是否存在数字序列,若a为 0 则输出 "NULL",否则输出最长连续数字序列的起始位置b和长度a。