大数的除法 不使用BigInteger Java实现

import java.util.Arrays;
/**
 * 今天做美团的笔试题,遇到这个问题,花了点时间去处理;
 * 代码实现了基本的功能,很多边界问题没有去考虑
 * 存在以下问题
 * 1,正负数没有考虑;
 * 2.如果商也是大数的话代码结果会出错。
 *
 * @author 刘传武
 *
 */
public class Solution {
    public void div(String a, String b) {

char[] chara = a.toCharArray();
        char[] charb = b.toCharArray();
        int[] numa = new int[a.length()];
        int[] numb = new int[b.length()];
        for (int i = 0; i < charb.length; i++) {
           numb[i] = charb[i]-‘0‘;
        
        }
        
        for (int i = 0; i < chara.length; i++) {
            numa[i] = chara[i]-‘0‘;
        
        }
        
        int div=0;
        while(compare(numa,numb)>0){
            numa= div(numa,numb);
            div ++;
        }
        StringBuffer sb =  new StringBuffer();
        sb.append(""+div+"  ");
        for (int i = 0; i < numa.length; i++) {
            sb.append(""+numa[i]);
        }
        System.out.println(""+sb);
    }

private int[] div(int[] numa, int[] numb) {
        for (int i = 0; i < numb.length; i++) {
            int tmpa = numa[numa.length-i-1];
            int tmpb = numb[numb.length-i-1];
            int sub =  tmpa-tmpb;
            int count = numa.length-1;
            if (sub>=0) {
                numa[numa.length-i-1] = sub;
            }else{
                numa[numa.length-i-1] = sub+10;
                count =numa.length- i-1-1;
                while(numa[count]==0){
                    numa[count] =9;
                    count--;
                    
                }
                numa[count]--;
                if (numa[0]==0) {
                    numa = Arrays.copyOfRange(numa,1, numa.length);
                            
                }
            }
            
        }
        
        
        return numa;
    }

int compare(int[] numa, int[] numb) {
        if (numa.length<numb.length) {
            return -1;
        }else if (numa.length>numb.length) {
            return 1;
        }else{
            for (int i = 0; i < numb.length; i++) {
                if (numa[i]>numb[i]) {
                    return 1;
                }
                if (numa[i]<numb[i]) {
                    return -1;
                }
            }
            return 0;
        }
        
    }

}

时间: 2024-11-09 01:24:47

大数的除法 不使用BigInteger Java实现的相关文章

【Java】-BigInteger大数类的使用【超强Java大数模板 总结】

1. 单元变量常用大数操作: import java.util.Scanner; import java.math.*; public class Main{ public static void main(String args[]){ Scanner cin= new Scanner(System.in); //使用Sacnner类创建cin对象 BigInteger a, b;//创建大数对象 while(cin.hasNext()){ a=cin.nextBigInteger(); b=

大数运算之 Java BigInteger 的基本用法

大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInteger 提供了高精度的基本运算,因此竞赛中常用 Java 解决高精度运算问题. 当然如果比赛支持 python 就当我没说. BigInteger 对象的创建 BigInteger 类在 java.math.BigInteger 包中,首先引用该包. import java.math.BigInt

Java中的大数处理类BigInteger和BigDecimar浅析

这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; BigInteger和BigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数).主要用于高精度计算中.这两个类使得java中的大数,高精度运算变得很简单. 下面从几个方面对BigInteger和BigDecima做一个简单的比较: 一.常量 BigInteger:ONE,ZE

UVA+POJ中大数实现的题目,持续更新(JAVA实现)

UVA10494:If We Were a Child Again 大数除法加取余 import java.util.Arrays; import java.util.Scanner; import java.math.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); BigInteger a,b; String s; while(cin.ha

ACM中java中BigInteger和Decimal用到的主要函数

java中大数以及高精度常用函数 使用java大数类解决问题时我们需要注意两个方面:1.不能有包名,也就是说我们要把主类放到默认的包里,如果你的代码里出现形如package cn.gov.test;这样的代码你很有可能会收获到RE 2.提交的类的类名必须为Main,如果是其他的名字你有可能收获到CE也有可能收获到WA(例如UVA) Scanner cin=new Scanner(System.in);// 读入 一.BigInteger import java.math.BigInteger;

java 大数详细讲解

介绍 java中用于操作大叔的类主要有俩种 第一个是BigInteger,代表大整数.第二个是BigDecimal,代表大浮点数.两种类的操作方法类似,所以我们只讲解BigInterger的用法 基本用法 Scanner input = new Scanner(System.in); BigInteger a = input.nextBigInteger(); BigInteger b = input.nextBigInteger(); 1.更改为大数数据类型 String s = "12345

Java从零开始学二十九(大数操作(BigIntger、BigDecimal)

一.BigInteger 如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作. 不可变的任意精度的整数.所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型).BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法.另外,BigInteger 还提供以下运算:模算术.GCD 计算.质数测试.素数生成.位操作以及一

java大数的基本函数

1.读入 Scanner cin=new Scanner(System.in);// 读入 while(cin.hasNextInt()) //等同于!=EOF,第一数一定要输入整形的 { } 大数的一般是: while(cin.hasNextBigInteger())  //第一个数一定要输入大数的 { } while(t-->0)   //等同于while(t--) { } 2.赋值 BigInteger b=BigInteger.valueOf(a); //a可为int,long,stri

java实现大数相加问题

闲来没事.写了个acm中常常遇到的大数加减问题的java 解决代码,我想说.用java的BigInteger 非常easy. 大爱java!! 比如: 实现多组输入的大数加减问题: import java.math.*; import java.util.*; public class Bignum { public static void main(String[] args) { BigInteger bigNumOne; BigInteger bigNumTwo; Scanner in =