请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法的输入则返回 error
数据范围:字符串长度满足
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNext()) { // 注意 while 处理多个 case String str1 = in.next(); String str2 = in.next(); System.out.println(caculate(str1,str2)); } } public static String caculate(String s1,String s2){ int i = s1.length() - 1,j = s2.length() - 1; int carry = 0; StringBuilder sb = new StringBuilder(); while(i >= 0 || j >= 0 || carry != 0){ if(i >= 0 && !Character.isDigit(s1.charAt(i)) || j >= 0 && !Character.isDigit(s2.charAt(j))) return "error"; int m = i < 0 ? 0 : s1.charAt(i) - '0'; int n = j < 0 ? 0 : s2.charAt(j) - '0'; int sum = m + n + carry; sb.append(sum % 10); carry = sum / 10; i --; j --; } return sb.reverse().toString(); } }
import java.util.*; import java.math.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { int res = 0; public static void main (String[] args) throws IOException{ BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String str; while ((str = bf.readLine()) != null) { String[] s = str.split(" "); String s1 = new StringBuilder(s[0]).reverse().toString(); String s2 = new StringBuilder(s[1]).reverse().toString(); int index = 0; boolean f = true; boolean flag = false; StringBuilder sb = new StringBuilder(); while (f && index < s1.length() && index < s2.length()) { char ch1 = s1.charAt(index); char ch2 = s2.charAt(index); if (!Character.isDigit(ch1) || !Character.isDigit(ch2)) { System.out.println("error"); f = false; break; } int ten = ch1 - '0' + ch2 - '0'; if (flag) { ten++; flag = false; } flag = ten >= 10?true:false; sb.append(ten % 10); index++; } while (f && index < s1.length()) { char ch1 = s1.charAt(index); if (!Character.isDigit(ch1)) { System.out.println("error"); f = false; break; } int ten = ch1 - '0'; if (flag) { ten++; flag = false; } flag = ten >= 10?true:false; sb.append(ten % 10); index++; } while (f && index < s2.length()) { char ch2 = s2.charAt(index); if (!Character.isDigit(ch2)) { System.out.println("error"); f = false; break; } int ten = ch2 - '0'; if (flag) { ten++; flag = false; } flag = ten >= 10?true:false; sb.append(ten % 10); index++; } if (flag) { sb.append(1); } if (f) { System.out.println(sb.reverse().toString()); } } } }运行时间:7ms
import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); String str1=sc.next(); String str2=sc.next(); int len1=str1.length(); int len2=str2.length(); String result=""; Stack<Integer> stack1=new Stack<>(); Stack<Integer> stack2=new Stack<>(); Stack<Integer> stack3=new Stack<>(); //让两个栈对齐 if(len1>len2) { int count=len1-len2; while(count-->0) stack2.push(0); } else if(len1<len2) { int count=len2-len1; while(count-->0) stack1.push(0); } //分别入栈 for(int i=0;i<str1.length();i++) { char ch=str1.charAt(i); if(ch<'0'||ch>'9') { System.out.println("error"); return; } stack1.push(ch-'0'); } for(int i=0;i<str2.length();i++) { char ch=str2.charAt(i); if(ch<'0'||ch>'9') { System.out.println("error"); return; } stack2.push(ch-'0'); } //相加入新栈 int num1,num2,num3,add=0; while( !stack1.isEmpty() && !stack2.isEmpty() ) { num1=stack1.pop(); num2=stack2.pop(); num3=num1+num2+add; add=num3/10; num3%=10; stack3.push(num3); } //处理最后的进位 if(add==1) stack3.push(1); while(!stack3.isEmpty()) result+=stack3.pop(); System.out.println(result); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { String[] s = new Scanner(System.in).nextLine().split(" "); String a; String b; if(s[0].length()>s[1].length()){ a=s[0]; b=s[1]; }else{ a=s[1]; b=s[0]; } if((!a.matches("^[0-9]*$")) || (!b.matches("^[0-9]*$"))){ System.out.println("error");return; } int c=a.length()-b.length(); for (int i = 0; i <c ; i++) { b = "0" + b; } String result=""; int t=0,i=a.length(); while(i>0){ i--; int r=a.charAt(i)+b.charAt(i)-'0'-'0'+t; result=""+(r%10)+result; t=r/10; } System.out.println((t==0?"":t)+result); } }
public class Test11 { public static void main(String args[]) { Scanner scanner = new Scanner(System.in); String c[] = scanner.nextLine().split(" "); char a[] = c[0].toCharArray(); char b[] = c[1].toCharArray(); int jingwei = 0; ArrayList<Integer> list = new ArrayList<>(); if (a.length>=b.length){ add(a, b, jingwei, list); } else{ add(b, a, jingwei, list); } for (int i=list.size()-1;i>=0;i--) System.out.print(list.get(i)); } private static boolean add(char[] a, char[] b, int jingwei, ArrayList<Integer> list) { for (int i=a.length-1,j=b.length-1;i>=0;i--,j--){ if (j>=0){ if (a[i]>'9'||a[i]<'0'||b[j]>'9'||b[j]<'0'){ System.out.println("error"); return true; } list.add((a[i]-'0'+b[j]-'0'+jingwei)%10); jingwei =(a[i]-'0'+b[j]-'0'+jingwei)/10; } else { if (a[i]>'9'||a[i]<'0'){ System.out.println("error"); return true; } list.add((a[i]-'0'+'0'-'0'+jingwei)%10); jingwei =(a[i]-'0'+'0'-'0'+jingwei)/10; } if (i==0&&jingwei!=0){ list.add(jingwei); } } return false; } }
import java.util.*; public class Main{ public static void main(String[] args) { Scanner input=new Scanner(System.in); while(input.hasNext()){ char[] s1=input.next().trim().toCharArray(); char[] s2=input.next().trim().toCharArray(); Stack stack1=new Stack(); Stack stack2=new Stack(); for(int i=0;i<s1.length;i++){ int cur=0; try{ cur=Integer.parseInt(String.valueOf(s1[i])); }catch(Exception e){ System.out.println("error"); return; } stack1.push(cur); } for(int i=0;i<s2.length;i++){ int cur=0; try{ cur=Integer.parseInt(String.valueOf(s2[i])); }catch(Exception e){ System.out.println("error"); return; } stack2.push(cur); } Stack res=new Stack(); int a=0; //进位标志 while(!stack1.isEmpty()||!stack2.isEmpty()){ int a1=0; if(!stack1.isEmpty()){ a1=stack1.pop(); } int a2=0; if(!stack2.isEmpty()){ a2=stack2.pop(); } int cur=a1+a2+a; if(cur>=10){ cur=cur%10; a=1; res.push(cur); }else{ res.push(cur); a=0; } } //最后还要判断最高位是不是进位了 if(a==1){ res.push(a); } StringBuilder sb=new StringBuilder(); while(!res.isEmpty()){ sb.append(res.pop()); } System.out.println(sb.toString()); } } }
Java做的很累啊。尾部相加,进位保留往前加,加到没有进位为之。 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String a = scanner.next(); String b = scanner.next(); if (!legal(a) || !legal(b)) { System.out.println("error"); }else { System.out.println(add(a, b)); } } public static String add(String a,String b) { int i = a.length() - 1; int j = b.length() - 1; int go = 0; String res = ""; while (i >= 0 && j >= 0) { int a1 = Integer.parseInt(a.substring(i, i + 1)); int b1 = Integer.parseInt(b.substring(j, j + 1)); int sum = a1 + b1 + go; if (sum >= 10) { go = 1; sum = sum - 10; }else { go = 0; } res = sum + res; i --; j --; } String rem = i > j ? a.substring(0, i - j) : b.substring(0, j - i); if (go == 0) { res = rem + res; } int cur = rem.length() - 1; while (cur >= 0) { int num = Integer.parseInt(rem.substring(cur, cur + 1)); int sum = num + go; if (sum >= 10) { sum = sum - 10; go = 1; } else { go = 0; break; } res = String.valueOf(sum) + res; cur --; } if (go == 1) { res = "1" + res; } return res; } public static boolean legal(String s) { for (int i = 0;i < s.length();i ++) { if ('0' <= s.charAt(i) && s.charAt(i) <= '9') { continue; }else return false; } return true; } }
运行时间:59ms
占用内存:9984k
一开始直接用的Integer,报case通过率80%,发现是输入的串很多个1超过了Integer范围,继续导入java.math.BigInteger搞定。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static boolean is1(String str) {
for(int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if(c >= '0' && c <= '9') {
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()) {
String str = scan.nextLine();
String[] arr = str.split(" ");
if(is1(arr[0]) && is1(arr[1])) {
BigInteger a = new BigInteger(arr[0]);
BigInteger b = new BigInteger(arr[1]);
System.out.println(a.add(b));
}
else {
System.out.println("error");
}
}
}
}
看下面分析的,针对「abc123 123」这样的输入也会返回「error」的优化后的code:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static boolean is1(String str) {
int count = 0;
for(int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if(c >= '0' && c <= '9') {
count++;
if(count == str.length()) {
count = 0;
return true;
}
}
}
return false;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()) {
String str = scan.nextLine();
String[] arr = str.split(" ");
if(is1(arr[0]) && is1(arr[1])) {
BigInteger a = new BigInteger(arr[0]);
BigInteger b = new BigInteger(arr[1]);
System.out.println(a.add(b));
}
else {
System.out.println("error");
}
}
}
}
两段代码都通过了OJ。
import java.util.Scanner比短是比不过Python的,这辈子也比不过。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String string = null;
while ((string = br.readLine()) != null) {
//判断输入的字符串是否合法,如果合法则只包含数字和空格
boolean flag = false;
for (int i = 0; i < string.length(); i++) {
char ch = string.charAt(i);
if (ch != ' ' && (ch <= '0' || ch >= '9'))
flag = true;
}
if (flag) {
System.out.println("error");
continue;
}
//合法进行相加,因为数比较大,用int数组来存储数据
String[] strings = string.split(" ");
String s1, s2;
if (strings[0].length() > strings[1].length()) {
s1 = strings[0];
s2 = strings[1];
} else {
s1 = strings[1];
s2 = strings[0];
}
int[] result = new int[101];
int k = 0;
int sum = 0;
int add = 0;
int len1 = s1.length();
int len2 = s2.length();
while (k < len2) {
sum = (s1.charAt(len1-1-k)-'0') + (s2.charAt(len2 - 1- k)-'0') + add;
if (sum < 10) {
result[k] = sum;
add = 0;
} else {
result[k] = sum - 10;
add = 1;
}
k++;
}
while (k < len1) {
sum = (s1.charAt(len1 - 1 - k) - '0') + add;
if (sum < 10) {
result[k] = sum;
add = 0;
} else {
result[k] = sum - 10;
add = 1;
}
k++;
}
if (add == 1) {
result[k] = 1;
} else {
k--;
}
while (k >= 0) {
System.out.print(result[k]);
k--;
}
System.out.println();
}
}
}
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { String n1 = new StringBuffer(sc.next()).reverse().toString(); String n2 = new StringBuffer(sc.next()).reverse().toString(); String result = ""; int overflow = 0; int i = 0; while(i <= Math.max(n1.length(), n2.length())) { if(i == Math.max(n1.length(), n2.length())) { if(overflow != 0) result = overflow + result; break; } int num1 = 0, num2 = 0; if(i < n1.length()) num1 = n1.charAt(i) - '0'; if(i < n2.length()) num2 = n2.charAt(i) - '0'; if(num1 < 0 || num1 > 9 || num2 < 0 || num2 > 9) { result = "error"; break; } int sum = num1 + num2 + overflow; result = (sum % 10) + result; overflow = sum / 10; ++i; } System.out.println(result); } } }
//这题让我知道有BigInteger的存在 import java.math.BigInteger; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); try { BigInteger num1 = in.nextBigInteger(); BigInteger num2 = in.nextBigInteger(); System.out.println(num2.add(num1)); } catch (Exception e) { System.out.println("error"); } } } ---------------------------------------------------------------------- //自己实现大数的相加 import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String regex = "\\d+"; while (in.hasNext()) { StringBuilder str1 = new StringBuilder(in.next()); StringBuilder str2 = new StringBuilder(in.next()); if (str1.toString().matches(regex) && str2.toString().matches(regex)) { //合法输入 processLen(str1, str2); String res = add(str1, str2); System.out.println(res); } else { System.out.println("error"); } } } private static void processLen(StringBuilder str1, StringBuilder str2) { int len1 = str1.length(), len2 = str2.length(); if (len1 > len2) for (int i = 0; i < len1 - len2; i++) str2.insert(0, "0"); else for (int i = 0; i < len2 - len1; i++) str1.insert(0, "0"); } private static String add(StringBuilder str1, StringBuilder str2) { StringBuilder res = new StringBuilder(); int reminder = 0; int sum = 0; for (int i = str1.length() - 1; i >= 0; i--) { sum = str1.charAt(i) + str2.charAt(i) - 2 * '0' + reminder; reminder = sum / 10; if (i > 0) res.append(sum % 10); else { res.append(sum % 10); if (reminder > 0) res.append(1); } } return res.reverse().toString(); } } ------------------------------------------------------------------------ import java.math.BigInteger; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String regex = "[+-]?\\d+"; while (in.hasNext()) { String str1 = in.next(); String str2 = in.next(); if (str1.matches(regex) && str2.matches(regex)) { BigInteger num1 = new BigInteger(str1); BigInteger num2 = new BigInteger(str2); System.out.println(num2.add(num1)); } else { System.out.println("error"); } } } }
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String[] strings = scanner.nextLine().split(" "); String string1 = strings[0]; String string2 = strings[1]; String str1; String str2; int length1 = string1.length(); int length2 = string2.length(); int a; int b; int c; int temp = 0; StringBuffer sb = new StringBuffer(); StringBuffer sb2 = new StringBuffer(); int x; int y; for (x = 0; x < length1; x++) { if (string1.charAt(x) < 48 || string1.charAt(x) > 57) { break; } } for (y = 0; y < length2; y++) { if (string2.charAt(y) < 48 || string2.charAt(y) > 57) { break; } } if (x == length1 && y == length2) { if (length1 == length2) { for (int i = length1 - 1; i >= 0; i--) { a = Integer.parseInt(String.valueOf(string1.charAt(i))); b = Integer.parseInt(String.valueOf(string2.charAt(i))); c = (a + b + temp) % 10; temp = (a + b + temp) / 10; sb.append(c); } if (temp != 0) { sb.append(temp); } } else { if (length1 > length2) { str1 = string1; str2 = string2; } else { int tem = length1; length1 = length2; length2 = tem; str1 = string2; str2 = string1; } int i = length1 - 1; int j = length2 - 1; for (; j >= 0; ) { a = Integer.parseInt(String.valueOf(str1.charAt(i))); b = Integer.parseInt(String.valueOf(str2.charAt(j))); c = (a + b + temp) % 10; temp = (a + b + temp) / 10; sb.append(c); if (j == 0) { if (i >= 2) { sb.append(Integer.parseInt(String.valueOf(str1.charAt(i - 1))) + temp); while (i >= 0) { sb.append(Integer.parseInt(String.valueOf(str1.charAt(i)))); i = i - 1; } break; } else { sb.append(Integer.parseInt(String.valueOf(str1.charAt(i - 1))) + temp); break; } } else { j = j - 1; i = i - 1; } } } for (int o = sb.length() - 1; o >= 0; o--) { sb2.append(sb.charAt(o)); } System.out.println(sb2.toString()); } else { System.out.println("error"); } } } }
public class Main{ public static String add(String a, String b){ int len1 = a.length(); int len2 = b.length(); //如果a的长度小于b,交换 if (len1 < len2){ String temp = a; a = b; b = temp; } len1 = a.length()-1; len2 = b.length()-1; StringBuilder sb = new StringBuilder(); //carry记录进位,sum记录每一位相加的和(取模后) int carry = 0; int sum = 0; int x;int y; while (len1 >=0){ x = a.charAt(len1)-'0'; if (len2 >=0){ y = b.charAt(len2) - '0'; }else { y = 0; } //判断输入是否合法 if (x > 9 || x<0 || y<0 || y>9){ return "error"; } sum = (x + y + carry)%10; carry = (x + y + carry)/10; len1--;len2--; sb.append(sum); } if (carry > 0){ sb.append(carry); } return sb.reverse().toString(); } public static void main(String[] args){ Scanner in = new Scanner(System.in); String s[] = in.nextLine().split(" "); if (s.length<2) { System.out.println("error"); return; } System.out.println(add(s[0],s[1])); } }
import java.util.Scanner; //try-catch捕捉转换异常 public class IntegerPlus { public static void main(String[] args) { Scanner sc = new Scanner(System.in); StringBuilder sb = new StringBuilder(); while (sc.hasNext()) { String s1 = sc.next(); String s2 = sc.next(); int temp1 = Math.max(s1.length(), s2.length()); int temp2 = Math.min(s1.length(), s2.length()); int[] jiashu = new int[temp1];// 加数集合 int[] beijiashu = new int[temp1];// 被加数集合 int[] jinwei = new int[temp1];// 进位数组集合 int[] result = new int[temp1];// 结果集合 try {// 数据转化出错,抛异常 if (s1.length() > s2.length()) { for (int i = 0; i < temp1; i++) jiashu[i] = Integer.valueOf(String.valueOf(s1.charAt(temp1 - i - 1))); for (int j = 0; j < temp2; j++) beijiashu[j] = Integer.valueOf(String.valueOf(s2.charAt(temp2 - j - 1)));// 补0 result[0] = (jiashu[0] + beijiashu[0]) % 10; jinwei[0] = (jiashu[0] + beijiashu[0]) / 10; sb.insert(0, result[0]); for (int k = 1; k < temp1; k++) { result[k] = (jiashu[k] + beijiashu[k] + jinwei[k - 1]) % 10; jinwei[k] = (jiashu[k] + beijiashu[k] + jinwei[k - 1]) / 10; sb.insert(0, result[k]);// 结果集合 } if (jinwei[temp1 - 1] > 0) sb.insert(0, 1); } else { for (int i = 0; i < temp1; i++) jiashu[i] = Integer.valueOf(String.valueOf(s2.charAt(temp1 - i - 1))); for (int j = 0; j < temp2; j++) beijiashu[j] = Integer.valueOf(String.valueOf(s1.charAt(temp2 - j - 1)));// 补0 result[0] = (jiashu[0] + beijiashu[0]) % 10; jinwei[0] = (jiashu[0] + beijiashu[0]) / 10; sb.insert(0, result[0]); for (int k = 1; k < temp1; k++) { result[k] = (jiashu[k] + beijiashu[k] + jinwei[k - 1]) % 10; jinwei[k] = (jiashu[k] + beijiashu[k] + jinwei[k - 1]) / 10; sb.insert(0, result[k]);// 结果集合 } if (jinwei[temp1 - 1] > 0) sb.insert(0, 1); } System.out.println(sb.toString()); sb.setLength(0); } catch (Exception e) { System.out.println("Error"); sb.setLength(0); } } } }
import java.util.Scanner; public class StringUtil { //整数加法 public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNext()){ String a = in.next(); String b = in.next(); int len = a.length(); int more = 0; if(a.length() < b.length()){ len = b.length(); more = 1; } boolean ok = true; //非法字符串判断 for(int i=0; i<len; i++){ if(i<a.length() && !(a.charAt(i)>='0' && a.charAt(i)<='9')){ System.out.println("error"); ok = false; break; } if(i<b.length() && !(b.charAt(i)>='0' && b.charAt(i)<='9')){ System.out.println("error"); ok = false; break; } } if(ok == false) continue; //字符串后半部分相加:a更长 int carry = 0; String res = ""; if(more == 0){ for(int i=len-1,j=b.length()-1; j>=0; j--){ int sum = Integer.valueOf(a.charAt(i--)+"") + Integer.valueOf(b.charAt(j)+"") + carry; // System.out.println("sum="+sum); carry = sum/10; res += sum%10; // System.out.println("res="+res); // System.out.println("carry="+carry); } for(int i=len-b.length()-1; i>=0; i--){ int sum = Integer.valueOf(a.charAt(i)+"") + carry; carry = sum/10; res += sum%10; // System.out.println("res="+res); } res += carry; System.out.println(new StringBuffer(res).reverse().toString().replaceAll("^[0]*","")); } //字符串后半部分相加:b更长 else{ for(int i=len-1,j=a.length()-1; j>=0; j--){ int sum = Integer.valueOf(b.charAt(i--)+"") + Integer.valueOf(a.charAt(j)+"") + carry; // System.out.println("sum="+sum); carry = sum/10; res += sum%10; // System.out.println("res="+res); // System.out.println("carry="+carry); } for(int i=len-a.length()-1; i>=0; i--){ int sum = Integer.valueOf(b.charAt(i)+"") + carry; carry = sum/10; res += sum%10; // System.out.println("res="+res); } res += carry; System.out.println(new StringBuffer(res).reverse().toString().replaceAll("^[0]*","")); } } } }