我是刚学java的菜鸟,前几天我与道个问题,怎样用数组实现大数的运算,想了很久不知如何下手,青各位大侠多指点指点

解决方案 »

  1.   

    大数运算的种类很多,看看我的博客,有一个大数相乘的例子,使用数组实现的,可惜是Delphi的,不知楼主能否看懂?
    http://datafans.blog.163.com/blog/static/8572788420094232462909/
      

  2.   

    偶的java版本数据结构上有 自己也在学习中 明天 有可能就给你代码
      

  3.   

    这里有下, 将String转化为数组, 再进行运算.http://download.csdn.net/source/1352494
      

  4.   

    其实大数运算,基本上还是手工模拟!
    我给你给个我原来在OJ上写的个大数相加,相乘也一样,除法就是减法,小数部分就是添0再减,直到自己要的精度为止.#include<stdio.h>
    #include<string.h>
    #define MAX 2000
    int Add(char a[],char b[],int x)
    {
        int i,flag;
        int add;
        for(i=MAX-1;i>=MAX-x;--i)
        {
            add=a[i]-'0'+b[i]-'0';
            if(add>=10)
            {
                a[i]=add-10+'0';
                a[i-1]+=1;
                flag=1;
            }
            else
            {
                a[i]=add+'0';
                flag=0;
            }
        }
        if(flag)
        {
            ++x;
        }
        return x;
    }
    int main(void)
    {
        char a[MAX],b[MAX];
        int k,z,n;
        int x,y,m;
        for(k=0;k<MAX;++k)
        {
            a[k]='0';
            b[k]='0';
        }
        m=scanf("%s %s",a,b);
        while(m==2)
        {
            x=strlen(a);
            y=strlen(b);
        
            z=x>y?x:y;
            a[x]='0';
            b[y]='0';
           for(k=1;k<=x;++k)
           {
            a[MAX-k]=a[x-k];
           }
           for(k=1;k<=y;++k)
           {
            b[MAX-k]=b[y-k];
           }
           n=Add(a,b,z);
           for(k=MAX-n;k<MAX;++k)
           {
             printf("%c",a[k]);
           }
           printf("\n");       for(k=0;k<MAX;++k)
           {
             a[k]='0';
             b[k]='0';
           }
           m=scanf("%s %s",a,b);    }
        return 0;
    }
      

  5.   

    大数相加减import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;public class BigNumber {
    public static int[] add(int[] a, int[] b) {
    int digit = 0;
    int[] c = new int[a.length];
    for (int i = a.length - 1; i >= 0; i--) {
    c[i] = a[i] + b[i] + digit;
    if (c[i] < 10)
    digit = 0;
    else {
    c[i] = c[i] - 10;
    digit = 1;
    }
    }
    return c;
    } public static int[] sub(int[] a, int[] b, int w) {
    int digit = 0;
    int[] c = new int[a.length];
    for (int i = a.length - 1; i >= 0; i--) {
    if (w <= 0) {
    c[i] = b[i] - a[i] - digit;
    if (c[i] >= 0)
    digit = 0;
    else {
    c[i] = c[i] + 10;
    digit = 1;
    }
    } else {
    c[i] = a[i] - b[i] - digit;
    if (c[i] >= 0)
    digit = 0;
    else {
    c[i] = c[i] + 10;
    digit = 1;
    }
    }
    }
    return c;
    } public static void main(String[] args) {
    int a[] = new int[50];
    int b[] = new int[50];
    int m = 0;
    int n = 0;
    int s = 0;
    int t = 0;
    int w = 0;
    BufferedReader buf = new BufferedReader(
    new InputStreamReader(System.in));
    try {
    System.out.print("请输入大数X:");
    String X = buf.readLine();
    System.out.print("请输入大数Y:");
    String Y = buf.readLine(); m = a.length - X.length();
    n = b.length - Y.length(); // 判断两个大数的大小
    if (X.length() > Y.length())
    w = 1;
    else if (X.length() < Y.length())
    w = -1;
    else
    w = X.compareTo(Y); // 转化为数组
    for (int i = 0; i < X.length(); i++) {
    a[m++] = X.charAt(i) - 48;
    } for (int j = 0; j < Y.length(); j++) {
    b[n++] = Y.charAt(j) - 48;
    } // 加法运算
    int[] c = BigNumber.add(a, b); // 截取前面多余的0
    for (int k = 0; k < c.length; k++) {
    if (c[k] > 0) {
    s = k;
    break;
    }
    } // 输出大数相加的结果
    System.out.print("大数相加的结果为:");
    for (int i = s; i < c.length; i++) {
    System.out.print(c[i]);
    } System.out.println(); // 减法运算
    int[] d = BigNumber.sub(a, b, w);
    for (int k = 0; k < d.length; k++) {
    if (d[k] > 0) {
    t = k;
    break;
    }
    }
    System.out.print("大数相减的结果为:");
    if (w < 0)
    System.out.print("-");
    for (int i = t; i < d.length; i++) {
    System.out.print(d[i]);
    }
    System.out.println();
    System.out.println();
    System.out.println();
    System.out.println();
    } catch (IOException e) { e.printStackTrace();
    }
    }}
      

  6.   

    求大数的阶乘import java.io.IOException;
    public class Array { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    int Data[] = new int[40];
    int Digit;
    int i, j, r, k;
    int n = 0;
    for (i = 1; i < 40; i++) {
    Data[i] = 0;
    }
    Data[0] = 1;
    Data[1] = 1;
    Digit = 1;
    System.out.println("please input int number");
    try {
    n = System.in.read();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    // int a=System.in.read();
    for (i = 1; i < n + 1; i++) {
    for (j = 1; j < Digit + 1; j++)
    Data[j] *= i;
    for (j = 1; j < Digit + 1; j++) {
    if (Data[j] > 10) {
    for (r = 1; r < Digit + 1; r++) {
    if (Data[Digit] > 10)
    Digit++;//
    Data[r + 1] += Data[r] / 10;
    Data[r] = Data[r] % 10;
    }
    }
    }
    }
    System.out.print(i + "!=");
    for (k = Digit; k > 0; k--)
    System.out.print(Data[k]);
    System.out.println("");
    }
    }
      

  7.   

    import java.util.*;
    import java.io.*;
    import java.math.*;
    public class AddBigInterger {
    public static void main(String[] args) throws IOException{
    LinkedList<Integer> a=new LinkedList<Integer>();
    LinkedList<Integer> b=new LinkedList<Integer>();

    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("input a:");
    String num1=br.readLine();
    System.out.println("input b:");
    String num2=br.readLine();

    //测试我的答案:
    BigInteger b1=new BigInteger(num1);
    BigInteger b2=new BigInteger(num2);
    System.out.println("标准答案:");
    System.out.println(b1.add(b2));

    //按4位断开分别放置到链表中
    for(int index=0;index<num1.length();){
    if(a.size()==0 && num1.length()%4!=0){
    a.add(Integer.parseInt(num1.substring(0,num1.length()%4)));
    index+=num1.length()%4;
    }
    else{
    if(index!=0)
    a.addFirst(Integer.parseInt(num1.substring(index, index+4)));
    else a.add(Integer.parseInt(num1.substring(index, index+4)));
    index+=4;
    }
    }

    for(int index=0;index<num2.length();){
    if(b.size()==0 && num2.length()%4!=0){
    b.add(Integer.parseInt(num2.substring(0,num2.length()%4)));
    index+=num2.length()%4;
    }
    else{
    if(index!=0)
    b.addFirst(Integer.parseInt(num2.substring(index, index+4)));
    else b.add(Integer.parseInt(num2.substring(index, index+4)));
    index+=4;
    }
    }
    // System.out.println(a);
    // System.out.println(b);
    List<Integer> c=add(a,b);

    StringBuilder result=new StringBuilder();
    for(int i:c)
    result.append(String.format("%04d",i));
    int index;
    for(index=0;index<result.length();index++)
    if(result.charAt(index)!='0') break;
    System.out.println("我的答案:");
    System.out.println(result.delete(0,index).toString());
    }
    /*
     * 模拟大整数加法,以1000为进率。
     */
    public static List add(LinkedList<Integer> a,LinkedList<Integer> b){
    int cf=0,i;//cf为进位
    LinkedList<Integer> result=new LinkedList<Integer>();
    for(i=0;i<a.size()&&i<b.size();i++){
    int t=a.get(i)+b.get(i)+cf;
    cf=t/10000;
    if(i!=0)
    result.addFirst(t%10000);
    else result.add(t%10000);
    }
    if(a.size()>b.size()){
    while(i<a.size()){
    int t=a.get(i)+cf;
    cf=t/10000;
    result.addFirst(t%10000);
    i++;
    }
    }
    else{
    while(i<b.size()){   
    int t=b.get(i)+cf;
    cf=t/10000;
    result.addFirst(t%10000);
    i++;
    }
    }
    while(cf!=0){
    result.addFirst(cf%10000);
    cf/=10000;
    }
    return result;
    }
    }
      

  8.   

    在这个 地方 有错  System.out.print(i + "!=");
    应该是 System.out.print(n + "!=");
    是求n的阶乘
      

  9.   

    就是在java中使用数组实现大数的运算(因为大数用普通的int long 等根本就用不了),主要是乘法。