PTA 正整数A+B(一种新的输入,正则+易错样例)

@[]正整数A+B

作者 陈越
内存限制 64 MB
单位 浙江大学
时间限制 400 ms
代码长度限制 16 KB

题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。但是有一点坑的就是 例如 123 456 ad 输出结果应该是 123+?= ?,而不是123+456=579。

输入格式:
输入在一行给出 A 和 B ,其间以空格分开。问题是 A 和 B 不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是 A 和 B 的分隔。题目保证至少存在一个空格,并且 B 不是一个空字符串。

输出格式:
如果输入的确是两个正整数,则按格式 A + B = 和 输出。如果某个输入不合要求,则在相应位置输出 ? ,显然此时和也是 ? 。

输入样例1:

123 456

输出样例1:

123 + 456 = 579

输入样例2:

  1. 18

输出样例2:

? + 18 = ?

输入样例3:

-100 blabla bla…33

输出样例3:

? + ? = ?

以下是代码:

/* by --zjy */
#include<bits/stdc++.h>   // C++万能头文件
using namespace std;   
int main()
{
	string s,t;	// 定义字符串型
	int flaga=1,flagb=1,count=0;
	int a=0,b=0;
	char c; 
	cin >> s >> t;
	c=getchar();			
	/* 这道题主要是这部分,例如123 456 ad 输出结果应该是  123+?= ?  
	   所以最后再输入一个字符判断是否是换行*/
	for(int i=0;i<s.size();i++){
		a=10*a+s[i]-'0';
		if(isdigit(s[i]))
		 	count++;
		if(count==s.size())
			flaga=0;
	} 		// 把字符串录入整型a中,并判断每个位是否是数字
	count=0;
	for(int i=0;i<t.size();i++){
		b=10*b+t[i]-'0';
		if(isdigit(t[i]))
			count++;
		if(count==t.size())
			flagb=0;
	}
	
	if(c!='\n')
		flagb=1;
	if(a<=0 || a>1000) flaga=1;
	if(b<=0 || b>1000) flagb=1;
	if(flaga==0) printf("%d",a);
	else printf("?");
	printf(" + ");
	if(flagb==0) printf("%d",b);
	else printf("?");
	printf(" = ");
	if(flaga==0 && flagb==0) printf("%d",a+b);
	else printf("?"); 	
	return 0;
} 

这个方法其实很一般,大多数都能够想到,我朋友提供一种更简单的方法。

#include<stdio.h>
int main(void){
    char str_a[100] = {0}, str_b[100] = {0}, str[100] = {0};
    int a = 0,b = 0;
    scanf("%s%[^\n]", str_a, str_b);    //由样例3可知第一个空格之后的字符串(包括空格)都为B串
    /* 这里用了正则表达式更好的处理了我所说的问题。不明白正则的可以去看一下[正则表达式](http://www.runoob.com/regexp/regexp-syntax.html) */
    
    sscanf(str_a,"%d%s", &a, str);      //使用sscanf处理字符串,取串中整数。剩下的部分给str
    if(a <= 1000 && a >= 1 && str[0] == '\0')//当整数部分符合区间,且str为空时输出
	printf("%d + ", a);    //当str_a符合时
    else{
	printf("? + ");        //当str_a不符合时
	a = 0;            //将a置零,储存str_a不符合整数的信息
	str[0] = '\0';    //将str[0]置零,防止对str_b进行sscanf取数值后为空时,str却不为空
    }//else end
    sscanf(str_b,"%d%s", &b, str);      //同str_a
    if(b <= 1000 && b >= 1 && str[0] == '\0'){
    	if(a)            //当str_a符合,且str_b符合时
            printf("%d = %d", b, a+b);
        else             //当str_a不符合,且str_b符合时
	    printf("%d = ?", b);
    }//if end
    else                 //当str_b符合时
	printf("? = ?");
    return 0;
}//main end

这种方法更高效,而且代码更简洁,如果你有更好的方法,欢迎在下方留言。我们共同进步!希望大家关注我,谢谢。

发布了19 篇原创文章 · 获赞 15 · 访问量 2478

猜你喜欢

转载自blog.csdn.net/qq_41829380/article/details/84787823
PTA