正整数 java_JAVA语言:正整数A+B(Java)PAT团体程序设计题解
本文主要向大家介紹了JAVA語言:正整數(shù)A+B(Java)PAT團(tuán)體程序設(shè)計(jì)題解,通過具體的內(nèi)容向大家展示,希望對(duì)大家學(xué)習(xí)JAVA語言有所幫助。
本題的目標(biāo)很簡單,就是求兩個(gè)正整數(shù)A和B的和,其中A和B都在區(qū)間[1,1000]。稍微有點(diǎn)麻煩的是,輸入并不保證是兩個(gè)正整數(shù)。
輸入格式:
輸入在一行給出A和B,其間以空格分開。問題是A和B不一定是滿足要求的正整數(shù),有時(shí)候可能是超出范圍的數(shù)字、負(fù)數(shù)、帶小數(shù)點(diǎn)的實(shí)數(shù)、甚至是一堆亂碼。
注意:我們把輸入中出現(xiàn)的第1個(gè)空格認(rèn)為是A和B的分隔。題目保證至少存在一個(gè)空格,并且B不是一個(gè)空字符串。
輸出格式:
如果輸入的確是兩個(gè)正整數(shù),則按格式“A + B = 和”輸出。如果某個(gè)輸入不合要求,則在相應(yīng)位置輸出“?”,顯然此時(shí)和也是“?”。
輸入樣例1:
123 456
輸出樣例1:
123 + 456 = 579
輸入樣例2:
22 . 18
輸出樣例2:
? + 18 = ?
輸入樣例3:
-100 blabla bla…33
輸出樣例3:
? + ? = ?
大家注意看題目中的那個(gè)“注意”:我們把輸入中出現(xiàn)的第1個(gè)空格認(rèn)為是A和B的分隔。題目保證至少存在一個(gè)空格,并且B不是一個(gè)空字符串。
我剛開始還沒死磕這個(gè)地方,就認(rèn)為輸入兩個(gè)數(shù)或是字符串,用第一個(gè)空格分割,因?yàn)锽可能是個(gè)字符串,中間也有空格。于是就寫了兩個(gè)輸入,然后再判斷,結(jié)果有個(gè)測(cè)試點(diǎn)就是過不去。
后來,我就看網(wǎng)上別人說的這個(gè)“注意”,題目說B不是一個(gè)空串,可能就隱含著A可能是一個(gè)空串,而且首先就輸入一個(gè)空格,然后直接輸入B。A為空。于是我就改了下代碼,先判斷第一個(gè)字符是不是空格,然后就過了。
import?java.util.Scanner;
import?java.util.regex.Pattern;
public?class?Main {
public?static?void?main(String[] args) {
Scanner scanner = new?Scanner(System.in);
// 先默認(rèn)都是 '?'
String A = "?";
String B = "?";
String result = "?";
// 直接讀取一行
String temp = scanner.nextLine();
// 如果輸入的第一個(gè)字符就是空格
if?(temp.charAt(0) == ' ') {
// 就認(rèn)為 A為空,空格后面就是 B
B = temp.substring(1);
} else?{
// 如果第一個(gè)字符不是空格,就可以認(rèn)為有兩個(gè)字符串
// 用空格分割一次
String[] temps = temp.split(" ", 2);
A = temps[0];?? // 第一個(gè)是 A
B = temps[1];?? // 第二個(gè)是 B
}
// 編輯正則表達(dá)式,匹配數(shù)字 0-9
Pattern pattern = Pattern.compile("[0-9]*");
boolean?A_ok = false;
boolean?B_ok = false;
// 因?yàn)檎5?A,B in [1, 1000],所以先從字符串長度判斷,然后判斷是不是數(shù)字
// 如果是數(shù)字,再判斷是不是在 [1, 1000]
if?(A.length() > 4?|| !pattern.matcher(A).matches() ||
Integer.parseInt(A) < 1?|| Integer.parseInt(A) > 1000) {
// 只要一個(gè)條件滿足 ,A 就是錯(cuò)誤字符
A = "?";
} else?{
// 否則 A 就是符合條件的整數(shù),標(biāo)記一下
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 都符合條件,就計(jì)算和
if?(A_ok && B_ok) {
int?sum = Integer.parseInt(A) + Integer.parseInt(B);
result = String.valueOf(sum);
}
// 輸出結(jié)果
System.out.println(A + " + "?+ B + " = "?+ result);
}
}
可是后來看了一下別人的代碼,發(fā)現(xiàn)并沒有判斷第一個(gè)字符是否為空格。比如先輸入一個(gè)空格,再輸入一個(gè)整數(shù),控制臺(tái)還會(huì)繼續(xù)等待輸入。這樣提交后,發(fā)現(xiàn)也是都對(duì)的。
#include
// 如果是1-1000的正整數(shù), 則返回正確值;否則返回 -1
int?convert(const?char?*str)
{
int?sum = 0;
for?(int?i = 0; str[i] !='\0'; i++)
{
// 如果是數(shù)字
if(str[i] >= '0'?&& str[i] <= '9')
{
// 如果數(shù)字長度超過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,到第一個(gè)空格就停止
scanf("%s ", A);
// 輸入B,到行尾
gets(B);
// 轉(zhuǎn)換判斷
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;
}?
最后我發(fā)現(xiàn),并不是那個(gè)條件的原因,不用管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,到第一個(gè)空格就停止
String A = scanner.next();
// 輸入B,到第二個(gè)空格
// 如果直接使用 String B = scanner.nextLine(); 會(huì)出錯(cuò)
// 它把 A 后面的那個(gè)空格也一起讀取了,會(huì)對(duì)B的判斷出錯(cuò)
// 修改一下,分開讀,如果B后面還有字符串,就是不合法
String B = scanner.next();
String afterB = scanner.nextLine();
String result = "?";
// 編輯正則表達(dá)式,匹配數(shù)字 0-9
Pattern pattern = Pattern.compile("[0-9]*");
boolean?A_ok = false;
boolean?B_ok = false;
// 因?yàn)檎5?A,B in [1, 1000],所以先從字符串長度判斷,然后判斷是不是數(shù)字
// 如果是數(shù)字,再判斷是不是在 [1, 1000]
if?(A.length() > 4?|| !pattern.matcher(A).matches() ||
Integer.parseInt(A) < 1?|| Integer.parseInt(A) > 1000) {
// 只要一個(gè)條件滿足 ,A 就是錯(cuò)誤字符
A = "?";
} else?{
// 否則 A 就是符合條件的整數(shù),標(biāo)記一下
A_ok = true;
}
// 如果B的長度大于4,或者包含非數(shù)字,或不在[1, 1000]范圍內(nèi),或者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 都符合條件,就計(jì)算和
if?(A_ok && B_ok) {
int?sum = Integer.parseInt(A) + Integer.parseInt(B);
result = String.valueOf(sum);
}
// 輸出結(jié)果
System.out.println(A + " + "?+ B + " = "?+ result);
}
}
本文由職坐標(biāo)整理并發(fā)布,希望對(duì)同學(xué)們有所幫助。了解更多詳情請(qǐng)關(guān)注編程語言JAVA頻道!
總結(jié)
以上是生活随笔為你收集整理的正整数 java_JAVA语言:正整数A+B(Java)PAT团体程序设计题解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: s2-045 java_S2-045漏洞
- 下一篇: arm7 mysql 编译安装_uboo