Java实现大数取余

题目要求简单描述就是:从控制台输入两个超过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();
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值