Функция сложения на 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 шт):
Спасибо всем , ребята ! Реализовал вот это :
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);
}
}
Очень познавательно ...
Немного видоизменил предыдущую версию :
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
Спасибо ...
Или так :
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"));
}
}
}
...