正整数 java_JAVA语言:正整数A+B(Java)PAT团体程序设计题解
本文主要向大家介绍了JAVA语言:正整数A+B(Java)PAT团体程序设计题解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式:
输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。
输出格式:
如果输入的确是两个正整数,则按格式“A + B = 和”输出。如果某个输入不合要求,则在相应位置输出“?”,显然此时和也是“?”。
输入样例1:
123 456
输出样例1:
123 + 456 = 579
输入样例2:
22 . 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla…33
输出样例3:
? + ? = ?
大家注意看题目中的那个“注意”:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。
我刚开始还没死磕这个地方,就认为输入两个数或是字符串,用第一个空格分割,因为B可能是个字符串,中间也有空格。于是就写了两个输入,然后再判断,结果有个测试点就是过不去。
后来,我就看网上别人说的这个“注意”,题目说B不是一个空串,可能就隐含着A可能是一个空串,而且首先就输入一个空格,然后直接输入B。A为空。于是我就改了下代码,先判断第一个字符是不是空格,然后就过了。
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 先默认都是 '?'
String A = "?";
String B = "?";
String result = "?";
// 直接读取一行
String temp = scanner.nextLine();
// 如果输入的第一个字符就是空格
if (temp.charAt(0) == ' ') {
// 就认为 A为空,空格后面就是 B
B = temp.substring(1);
} else {
// 如果第一个字符不是空格,就可以认为有两个字符串
// 用空格分割一次
String[] temps = temp.split(" ", 2);
A = temps[0]; // 第一个是 A
B = temps[1]; // 第二个是 B
}
// 编辑正则表达式,匹配数字 0-9
Pattern pattern = Pattern.compile("[0-9]*");
boolean A_ok = false;
boolean B_ok = false;
// 因为正常的 A,B in [1, 1000],所以先从字符串长度判断,然后判断是不是数字
// 如果是数字,再判断是不是在 [1, 1000]
if (A.length() > 4 || !pattern.matcher(A).matches() ||
Integer.parseInt(A) < 1 || Integer.parseInt(A) > 1000) {
// 只要一个条件满足 ,A 就是错误字符
A = "?";
} else {
// 否则 A 就是符合条件的整数,标记一下
A_ok = true;
}
// 同判断 A 一样
if (B.length() > 4 || !pattern.matcher(B).matches() ||
Integer.parseInt(B) < 1 || Integer.parseInt(B) > 1000) {
B = "?";
} else {
B_ok = true;
}
// 如果 A 、B 都符合条件,就计算和
if (A_ok && B_ok) {
int sum = Integer.parseInt(A) + Integer.parseInt(B);
result = String.valueOf(sum);
}
// 输出结果
System.out.println(A + " + " + B + " = " + result);
}
}
可是后来看了一下别人的代码,发现并没有判断第一个字符是否为空格。比如先输入一个空格,再输入一个整数,控制台还会继续等待输入。这样提交后,发现也是都对的。
#include
// 如果是1-1000的正整数, 则返回正确值;否则返回 -1
int convert(const char *str)
{
int sum = 0;
for (int i = 0; str[i] !='\0'; i++)
{
// 如果是数字
if(str[i] >= '0' && str[i] <= '9')
{
// 如果数字长度超过4位
if (i > 4) {
return -1;
}
sum = sum * 10 + str[i] - '0';
}
else
{
// 否则返回 -1
return -1;
}
}
if(sum >= 1 && sum <= 1000)
{
return sum;
}
return -1;
}
int main()
{
char A[10000], B[10000];
int a, b;
// 输入A,到第一个空格就停止
scanf("%s ", A);
// 输入B,到行尾
gets(B);
// 转换判断
a = convert(A);
b = convert(B);
// 输出
if (a == -1)
{
printf("? + ");
}
else
{
printf("%d + ", a);
}
if (b == -1)
{
printf("? = ");
}
else
{
printf("%d = ", b);
}
if (a == -1 || b == -1)
{
printf("?\n");
}
else
{
printf("%d\n", a + b);
}
return 0;
}
最后我发现,并不是那个条件的原因,不用管A是否为空,还是正常读取,不过我修改了一下输入,最终也通过了:
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入A,到第一个空格就停止
String A = scanner.next();
// 输入B,到第二个空格
// 如果直接使用 String B = scanner.nextLine(); 会出错
// 它把 A 后面的那个空格也一起读取了,会对B的判断出错
// 修改一下,分开读,如果B后面还有字符串,就是不合法
String B = scanner.next();
String afterB = scanner.nextLine();
String result = "?";
// 编辑正则表达式,匹配数字 0-9
Pattern pattern = Pattern.compile("[0-9]*");
boolean A_ok = false;
boolean B_ok = false;
// 因为正常的 A,B in [1, 1000],所以先从字符串长度判断,然后判断是不是数字
// 如果是数字,再判断是不是在 [1, 1000]
if (A.length() > 4 || !pattern.matcher(A).matches() ||
Integer.parseInt(A) < 1 || Integer.parseInt(A) > 1000) {
// 只要一个条件满足 ,A 就是错误字符
A = "?";
} else {
// 否则 A 就是符合条件的整数,标记一下
A_ok = true;
}
// 如果B的长度大于4,或者包含非数字,或不在[1, 1000]范围内,或者B后面还有字符,都算非法
if (B.length() > 4 || !pattern.matcher(B).matches() ||
Integer.parseInt(B) < 1 || Integer.parseInt(B) > 1000 ||
afterB.length() > 0) {
B = "?";
} else {
B_ok = true;
}
// 如果 A 、B 都符合条件,就计算和
if (A_ok && B_ok) {
int sum = Integer.parseInt(A) + Integer.parseInt(B);
result = String.valueOf(sum);
}
// 输出结果
System.out.println(A + " + " + B + " = " + result);
}
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!
正整数 java_JAVA语言:正整数A+B(Java)PAT团体程序设计题解相关推荐
- 【CCCC】PAT : 团体程序设计天梯赛-练习集 L1 答案
[CCCC]PAT : 团体程序设计天梯赛-练习集 L1 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 标号 标题 分数 通过数 提交数 通过率 L1-001 Hello World 5 46779 1 ...
- 【CCCC】PAT : 团体程序设计天梯赛-练习集 L3 答案(01-23)
[CCCC]PAT : 团体程序设计天梯赛-练习集 L3 答案 顶着满课,整整一星期,终于咕完了.(:´д`)ゞ 知识点分类(23): 1.搜索模拟(5):BFS,DFS,最短路,路径打印 2.计算几 ...
- 【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码
[CCCC]PAT : 团体程序设计天梯赛-练习集 L2 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 知识点分类(32): 1.树锯结构(9):二叉树的存储,编号,遍历顺序转换,求深度,底层节点,从底 ...
- L1-074 两小时学完C语言 (5 分)-PAT 团体程序设计天梯赛 GPLT
知乎上有个宝宝问:"两个小时内如何学完 C 语言?"当然,问的是"学完"并不是"学会". 假设一本 C 语言教科书有 N 个字,这个宝宝每分 ...
- l1-047. 装睡c语言,L1-047 装睡 (10 分)- PAT团体程序设计天梯赛
L1-047 装睡 (10 分) 你永远叫不醒一个装睡的人 -- 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-7 ...
- L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT
本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...
- [Python] L1-005. 考试座位号-PAT团体程序设计天梯赛GPLT
L1-005. 考试座位号 每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号 ...
- L2-027 名人堂与代金券-PAT团体程序设计天梯赛GPLT
对于在中国大学MOOC学习"数据结构"课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利:总评分在 [G, 100] 区间内者,可以得到 50 元 ...
- L1-050 倒数第N个字符串-PAT团体程序设计天梯赛GPLT
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, aab, aac, . ...
最新文章
- 【独家】去哪儿网PRD兵法秘籍大公开,火爆课程精彩直击!
- java学习(159):两个线程共同完成1到100计算
- 灵魂拷问!mysqlproxy配置
- Jedis 常用API使用
- ArcGIS应用(十六)Arcgis 点对连线制作航空线路图
- html5 扩展 cs6,Dreamweaver CS6提高了HTML5工具的效率
- 盟军敢死队I:深入敌后--秘籍
- Moblin v2开发环境设置——创建一个新应用程序
- 【时间函数】gettimeofday
- [《关于外婆家的一些记忆》闲笔记事集]2012年1月22日
- 小程序中子组件父/组件互相传值以及互相接收
- Linux下磁盘常见错误分析与检测工具使用
- Java --- Xstream使用
- 渡过“去小米化”阵痛期,华米科技能否自立?
- 零跑汽车迎难而上,坚持全域自研战略指引
- day48 - 49
- 【笔记整理】通信原理第九章复习——循环码
- C语言的数据类型详解及应用
- Thymeleaf模板使用实例+模板分页
- 浅析测试计划,测试方案及测试策略