听朋友华为面试一道大数求余
import java.math.BigInteger;
import java.util.Scanner;
//大数求余数
public class Qiuyu {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try{
String str = scanner.nextLine();
scanner.close();
String[] strArr = str.split(" ");
BigInteger bigInteger = new BigInteger(strArr[0]);
BigInteger bigInteger01 = new BigInteger(strArr[1]);
System.out.println(bigInteger.remainder(bigInteger01));
}catch(Exception ex){
System.out.println("null");
}
}
}
String类型求余的话:
import java.util.Scanner;
/**
* Created by user on 2016/11/3.
*/
public class Jisuan {
public static void main(String[] args) {
Scanner sc1=new Scanner(System.in);
String str1= sc1.next();
Scanner sc2=new Scanner(System.in);
String str2= sc2.next();
System.out.println(remainder(str1, str2));
}
//求和
public static String add(String s1, String s2) {
StringBuffer res = new StringBuffer();
if (s1.contains("-") && s2.contains("-")) {
res.append("-");
s1 = s1.replace("-", "");
s2 = s2.replace("-", "");
} else if ((!s1.contains("-") && s2.contains("-"))) {
return sub(s1, s2.replace("-", ""));
} else if ((s1.contains("-") && !s2.contains("-"))) {
return sub(s2, s1.replace("-", ""));
}
int len = Math.abs(s1.length() - s2.length());
if (s1.length() > s2.length()) {
s2 = castSame(s2, len);
} else {
s1 = castSame(s1, len);
}
int n = 0;
for (int i = s1.length() - 1; i >= 0; i--) {
int temp = (s1.charAt(i) - '0' + s2.charAt(i) - '0' + n);
if (i == 0) {
res.append(temp % 10).append(temp / 10 == 0 ? "" : temp / 10);
} else {
res.append(temp % 10);
n = temp / 10;
}
}
return kickZero(String.valueOf(res.reverse()));
}
//求差
public static String sub(String s1, String s2) {
boolean flag = false;
StringBuffer res = new StringBuffer();
if (s1.contains("-") && s2.contains("-")) {
return sub(s2.replace("-", ""), s1.replace("-", ""));
} else if ((!s1.contains("-") && s2.contains("-"))) {
return add(s1, s2.replace("-", ""));
} else if ((s1.contains("-") && !s2.contains("-"))) {
return "-" + add(s2, s1.replace("-", ""));
}
if (!isGreater(s1, s2)) {
flag = true;
String temp = s1;
s1 = s2;
s2 = temp;
}
s2 = castSame(s2, s1.length() - s2.length());
int n = 0;
for (int i = s1.length() - 1; i >= 0; i--) {
Integer temp = s1.charAt(i) - '0' - s2.charAt(i) + '0' - n;
temp = i == 0 ? (temp == 0 ? null : temp) : temp;
res.append(temp == null ? "" : temp >= 0 ? temp : temp + 10);
n = temp == null ? 0 : temp < 0 ? 1 : 0;
}
return kickZero(flag ? String.valueOf(res.append("-").reverse()) : String.valueOf(res.reverse()));
}
//求余
public static String remainder(String s1, String s2) {
if ("0".equals(s2)) {
return "ERROR";
}
if (!isGreater(s1, s2)) {
return s1;
}
StringBuffer res = new StringBuffer();
int n = s2.length();
String temp = s1.substring(0, n);
while (true) {
int count = 0;
System.out.println("n:" + n);
while (sub(temp, s2).contains("-")) {
temp += s1.charAt(n);
n++;
}
while (true) {
count++;
temp = sub(temp, s2);
if (sub(temp, s2).contains("-")) {
break;
}
}
res.append(count);
if (n >= s1.length()) {
return temp;
}
}
}
//判断大数
public static boolean isGreater(String s1, String s2) {
if (s1.length() > s2.length()) {
return true;
} else if (s1.length() < s2.length()) {
return false;
} else if (s1.length() == s2.length()) {
int i = 0;
while (i < s1.length()) {
if (s1.charAt(i) < s2.charAt(i)) {
return false;
} else if (s1.charAt(i) > s2.charAt(i)) {
return true;
}
i++;
}
}
return true;
}
public static String castSame(String s, int len) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < len; i++) {
sb.append("0");
}
s = String.valueOf(sb.append(s));
return s;
}
public static String kickZero(String s) {
int i = 0;
while (s.length() > 1) {
if ('0' == s.charAt(0)) {
s = s.substring(1);
} else {
break;
}
}
return s;
}
}

本文探讨了在面试中遇到的String类型大数求余问题,主要涉及如何处理字符串形式的大整数进行取余运算的方法和策略。
5848

被折叠的 条评论
为什么被折叠?



