1 条题解

  • 0
    @ 2025-5-4 12:01:12

    分析:

    解题的核心思想是对输入的字符串进行多轮检查。首先去掉字符串前导空格,接着统计字符串中 e(或 E)和小数点的数量,根据其数量初步判断合法性。若包含 e(或 E),则进一步检查其位置以及后面的指数部分是否合法。最后检查除去符号和指数部分后,剩余部分是否为合法的数字或包含合法的小数点。

    解题原理

    1.预处理:去除字符串前导空格,简化后续处理。

    2.计数检查:统计 e(或 E)和小数点的数量,若 e(或 E)数量大于 1、小数点数量大于 1 或者两者数量之和为 0,则判定字符串不合法。

    3.e(或 E)位置与指数合法性检查:若字符串中包含 e(或 E),检查其位置是否在字符串首尾,若在则不合法。同时检查 e(或 E)后面的指数部分,若存在非数字字符则不合法。

    4.数字部分合法性检查:去除符号后,检查剩余部分是否为合法数字,若包含小数点,需确保小数点位置合理。

    实现步骤

    1.输入读取:循环读取输入字符串,直到输入为 "*" 时停止。

    2.去除前导空格:找到字符串中第一个非空格字符,截取字符串去除前导空格。

    3.计数统计:统计字符串中 e(或 E)和小数点的数量。

    4.初步合法性判断:根据 e(或 E)和小数点的数量,判断字符串是否合法。

    5.e(或 E)及指数部分检查:若字符串包含 e(或 E),检查其位置和指数部分的合法性。

    6.数字部分检查:去除符号后,检查剩余部分是否为合法数字,包含小数点时检查其位置是否合理。

    7.输出结果:根据检查结果输出字符串是否合法的信息。

    c++代码:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main()
    {
    	while(1)
    	{
    		string s;
    		getline(cin,s);
    		if(s=="*")
    		{
    			break;
    		}
    		int flag=1;
    		int i;
    		for(i=0;i<s.size();i++)
    		{
    			if(s[i]!=' ')
    			{
    				break;
    			}
    		}
    		s=s.substr(i,s.size());//去掉多余的前缀空格 
    		//cout<<s<<endl;
    		int p_c=0;//小数点数量
    		int e_c=0;//e的数量 
    		for(int i=0;i<s.size();i++)
    		{
    			if(s[i]=='e'||s[i]=='E')
    			{
    				e_c++;
    			}
    			if(s[i]=='.')
    			{
    				p_c++;
    			}
    		}
    		if(e_c>1 || p_c>1 ||(e_c+p_c)==0)   
    		{
    			//cout<<"hi0"<<endl;
    			flag=0;
    		}
    		int over=s.size();
    		if(flag==1 && e_c==1)
    		{
    			int wz=-1;
    			for(int i=0;i<s.size();i++)
    			{
    				if(s[i]=='e'||s[i]=='E')
    				{
    					if(i==0 || i==(s.size()-1))
    					{
    						flag=0;
    						//cout<<"hi1"<<endl;
    					}else
    					{
    						wz=i;
    						over=i;
    					}	
    				}
    			}
    			if(wz!=-1)
    			{
    				if(s[wz+1]=='+'||s[wz+1]=='-')
    				{
    					wz++;
    				}
    				for(int i=wz+1;i<s.size();i++)
    				{
    					if(s[i]<'0'||s[i]>'9')
    					{
    						flag=0;
    						//cout<<"hi2"<<endl;
    					}
    				}				
    			}
    		}
    		if(flag==1)
    		{
    			int i=0;
    			if(s[i]=='+'||s[i]=='-')
    			{
    				i=1;
    			}
    			int t=i;
    			for(;i<over;i++)
    			{
    				if(p_c==1 && s[i]=='.'&& i<(over-1) && i>t)
    				{
    					continue;
    				}
    				if(s[i]<'0'||s[i]>'9')
    				{
    					//cout<<"hi3"<<endl;
    					flag=0;
    					break;
    				}
    			}
    		}
    		cout<<s;
    		if (flag)
    			cout<<" is legal.\n";
    		else cout<<" is illegal.\n";
    	} 
    	return 0;
    }
    
    • 1

    信息

    ID
    538
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者