Функция сложения на Java (без ограничения размера числа)

В каждом языке программирования существует ограничения на размер числа (даже , если это тип long long в C++ ).

Так вот, для преодоления этого ограничения и была написана эта функция.

Суть её в том , что вместо сложения больших чисел используется порaзрядное сложение двух остатков от деления на 10.

Если при этом сумма превышает 10 , остаток записывается в переменную и при следующей итерации слагается с имеющимися остатками.

При этом всё это записывается в строку. Для реализации такого подхода все строки приходится переворачивать.

Вот эта функция :


public class ADD
{
    
    public static void main(String[] args)
    {
        String s="0";
        int i=0;
        while (i < args.length)
        {
            s = add(s, args[i]);
            i++;
        }
        System.out.println(s);
    }
    
    public static String add(String a, String b)
    {
        if (a.length() != b.length())
        {
            if (a.length() > b.length())
            {
                for (int j=a.length() - b.length();j > 0;j--)
                {
                    b = 0 + b;
                }
            }
            else
            {
                for (int j=b.length() - a.length();j > 0;j--)
                {
                    a = 0 + a;
                }
            }
        }
        char[] aa=reverse(a).toCharArray();
        char[] bb=reverse(b).toCharArray();
        int i=0;
        String t="";
        int m=0;
        while (i < aa.length)
        {
            int x=(Integer.parseInt(aa[i] + "") + Integer.parseInt(bb[i] + "") + m);
            String p=x + "";
            if (p.length() > 1 && i < aa.length - 1)
            {
                x = Integer.parseInt(p.toCharArray()[1] + "");
                m = Integer.parseInt(p.toCharArray()[0] + "");
            }
            else
            {
                m = 0;
            }
            t = x + t;
            i++;
        }
        return t;
    }
    
    public static String reverse(String s)
    {
        String t="";
        int j=s.length() - 1;
        for (int i=0;i < s.length();i++)
        {
            t += s.charAt(j);
            j--;
        }
        return t;
    }
    
    public static String mov(String a, String b)
    {
        return (Integer.parseInt(a) - Integer.parseInt(b)) + "";
    }
    
}

Теперь сам вопрос :

Как реализовать такую-же функцию , но уже вычитания? И существует-ли другой подход к данной проблеме?


Ответы (3 шт):

Автор решения: fff894299

Спасибо всем , ребята ! Реализовал вот это :

import java.math.*;

public class MATH
{
    public static void main(String[] args){
        BigInteger x=new BigInteger("0");
        String cmd="";
        int i=0;
        for(String a:args){
            if(i==0){
                cmd=a;
                i++;
                continue;
            }
            else{
                if(cmd.equals("add")){
                    x=x.add(new BigInteger(args[i]));
                }
                else if(cmd.equals("sub")){
                    x=x.subtract(new BigInteger(args[i]));
                }
                else if(cmd.equals("mul")){
                    x=x.multiply(new BigInteger(args[i]));
                }
                else if(cmd.equals("div")){
                    x=x.divide(new BigInteger(args[i]));
                }
            }
            i++;
        }
        System.out.println(x);
    }
}

Очень познавательно ...

→ Ссылка
Автор решения: fff894299

Немного видоизменил предыдущую версию :

import java.math.*;

public class MATH
{
    public static void main(String[] args){
        BigInteger x=new BigInteger("0");
        String cmd="";
        int i=0;
        for(String a:args){
            if(i==0){
                cmd=a;
                i++;
                continue;
            }
            else{
                if(cmd.equals("add")){
                    x=new BigInteger(args[1]).add(new BigInteger(args[2]));
                }
                if(cmd.equals("sub")){
                    x=new BigInteger(args[1]).subtract(new BigInteger(args[2]));
                }
                if(cmd.equals("mul")){
                    x=new BigInteger(args[1]).multiply(new BigInteger(args[2]));
                }
                if(cmd.equals("div")){
                    x=new BigInteger(args[1]).divide(new BigInteger(args[2]));
                }
            }
            i++;
        }
        System.out.println(x);
    }
}

И теперь можно считать безразмерные числа Фибоначчи :

a=0
b=1
fibo(){
i=$1
while [ ! $i -eq 0 ]
do
echo $a
export c=`math add $a $b`
export a=$b
export b=$c
export i=`math sub $i 1`
done
}

fibo 1000

Спасибо ...

→ Ссылка
Автор решения: fff894299

Или так :

import java.math.*;

public class FIBO
{
    public static void main(String[] args){
        fibo(args[0]);
    }
    
    public static void fibo(String s){
        BigInteger i=new BigInteger(s);
        BigInteger a=new BigInteger("0");
        BigInteger b=new BigInteger("1");
        while(i.compareTo(new BigInteger("0"))!=0){
            System.out.println(a);
            BigInteger c=a.add(b);
            a=b;
            b=c;
            i=i.subtract(new BigInteger("1"));
        }
    }
}

...

→ Ссылка