题目要求简单描述就是:从控制台输入两个超过long型数值范围的数,输出第一个数对第二数的余数。
Java中有个BigInteger类,可以直接对大数操作,而且效率比我自己写的好得多,(⊙﹏⊙)b。
但是BigInteger类不是该题目考查的方向,所以将这种方法的代码放在最后。
首先来看用字符串处理大数的方法:
import java.util.*;
public class Bigintremainder3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
try{
String s1=sc.next();
String s2=sc.next();
int n1=s1.length();
int n2=s2.length();
int[] int1=new int[n1];
for(int i=n1-1,k=0;i>=0&&k<n1;i--,k++){
int1[i]=Integer.parseInt(s1.substring(k,k+1));
}
int[] int2=new int[n2];
for(int i=n2-1,k=0;i>=0&&k<n2;i--,k++){
int2[i]=Integer.parseInt(s2.substring(k,k+1));
}
int[] int3=new int[n1];
if(!isdelable(int1, int2)){
System.out.print(s1);
}else{
int3=delete(int1, int2);
while(isdelable(int3, int2)){
//delete(s3,s2);
int3=delete(int3, int2);
}
if(int3.length==0){
System.out.println(0);
}else{
for(int i=int3.length-1;i>=0;i--){
System.out.print(int3[i]);
}
}
}
sc.close();
}catch(Exception ex){
//System.out.println("null");
ex.printStackTrace();
}
}
//delete函数用来实现两个仅包含数字的字符串相减
static int[] delete(int[] int1,int[] int2){
int n1=int1.length;
int n2=int2.length;
int[] int3=new int[n1];
for(int i=0;i<n2;i++){
int3[i]=int2[i];
}
for(int i=0;i<n1;i++){
if(int1[i]>=int3[i]){
int1[i]=int1[i]-int3[i];
}else{
int1[i]=int1[i]+10-int3[i];
int1[i+1]--;
}
}
int k=0;
for(int i=n1-1;i>=0;i--){
if(int1[i]==0){
k++;
}else
break;
}
int[] int4=new int[n1-k];
for(int i=n1-k-1;i>=0;i--){
int4[i]=int1[i];
}
return int4;
}
//isdelable用来判断是否仍然可以继续执行减法
static boolean isdelable(int[] int1,int[] int2){
boolean b=false;
int n1=int1.length;
int n2=int2.length;
if(n1<n2){
b=false;
}else if(n1==n2){
int i=n1-1;
while(i>0&&int1[i]==int2[i]){
i--;
}
if(int1[i]<int2[i]){
b=false;
}else{
b=true;
}
}else{
b=true;
}
return b;
}
}
下面是BigInteger类的方法:
import java.math.*;
import java.util.*;
public class Bigintremainder {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
try{
BigInteger bi1=sc.nextBigInteger();
BigInteger bi2=sc.nextBigInteger();
BigInteger bi3;
bi3=bi1.remainder(bi2);
System.out.println(bi3);
}catch(Exception ex){
System.out.println("null");
}
sc.close();
}
}