常用数据结构算法 : 大数的加减

package wellhold.algorithm.bigInteger;

public class BigDataPlus
{
    public static void main(String[] args) {
        System.out.println(Plus("92321231", "12345123123"));
    }

    public static String Plus(String num1,String num2)
    {
        num1=new StringBuffer(num1).reverse().toString();
        num2=new StringBuffer(num2).reverse().toString();

        StringBuffer res=new StringBuffer();

        String longNum=num1.length()>num2.length()?num1:num2;
        String ShortNum=num1.length()>num2.length()?num2:num1;

        //补到相同长度
        for(int i=ShortNum.length();i<longNum.length();i++)
        {
            ShortNum+="0";
        }
        boolean flag=false;
        int tmp;

        for(int i=0;i<ShortNum.length();i++)
        {
            tmp=ShortNum.charAt(i)-48+longNum.charAt(i)-48;
            //第一位有没有进位
            tmp=flag?tmp+1:tmp;
            flag=false;

            if(tmp>10)
            {
                flag=true;
                tmp-=10;
            }
            res.append(tmp);
        }
        res=flag?res.append("1").reverse():res.reverse();
        return res.toString();
    }
}
package wellhold.algorithm.bigInteger;

public class BigDataSub {
    public static void main(String[] args) {
        System.out.println(bigNumberSub("3000", "2999"));
    }

    public static String bigNumberSub(String numb1, String numb2)
    {

        // 将字符串翻转并转换成字符数组
        numb1 = new StringBuffer(numb1).reverse().toString();
        numb2 = new StringBuffer(numb2).reverse().toString();

        int lenA = numb1.length();
        int lenB = numb2.length();

        // 找到最大长度
        int len = lenA > lenB ? lenA : lenB;

        // 表示结果的正负
        char sign = ‘+‘;

        // 判断最终结果的正负
        if (lenA < lenB) sign = ‘-‘;
        else if (lenA == lenB)
        {
            for(int i=lenA-1;i>=0;i--)
            {
                if(numb1.charAt(i)>numb2.charAt(i))sign=‘+‘;
                else if(numb1.charAt(i)<numb2.charAt(i))sign=‘-‘;
                else continue;
                break;
            }
        }

        boolean flag=false;
        StringBuffer res=new StringBuffer();
        // 计算结果集,如果最终结果为正,那么就a-b否则的话就b-a
        for (int i = 0; i < len; i++)
        {
            int aint = i < lenA ? (numb1.charAt(i) - ‘0‘) : 0;// 将字符串转为数字,以最长的为准,不够的补0
            int bint = i < lenB ? (numb2.charAt(i) - ‘0‘) : 0;

            int tmp=0;
            if (sign == ‘+‘)
            {
                tmp = flag?aint-bint-1:aint-bint;
            }
            else
            {
                tmp = flag?bint-aint-1:bint-aint;
            }

            //置标志位
            flag=false;
            if(tmp<0)
            {
                tmp=tmp+10;
                flag=true;
            }

            res.append(tmp);
        }

        //检查有没有0
        for(int i=res.length()-1;i>=0;i--)
        {
            if(res.charAt(i)==‘0‘)res.deleteCharAt(i);
            else break;
        }

        // 如果最终结果为负值,就将负号放在最前面,正号则不需要
        if (sign == ‘-‘) {
            res.append(‘-‘);
        }

        if(res.length()==0)return "0";

        return res.reverse().toString();
    }
}
时间: 2024-07-31 10:12:19

常用数据结构算法 : 大数的加减的相关文章

常用数据结构算法 : 完全二叉树判别

import java.util.LinkedList; import java.util.Queue; /********************************************************** * 非递归方法,基本是层次遍历二叉树 依次检查每一个节点: * 1.当发现有一个节点的左子树为空,右子树不为空时 直接返回false. * 2.当发现有一个节点的左子树不为空,右子树为空时,置标志位为1. * 3.当发现有一个节点的左右子树均为空时,置标志位为1. ****

大数加减乘法

大数的相关计算问题一直是编程比赛常考的题目,在蓝桥杯比赛之前又把大数的加减乘法做了一遍.大数除法比较难,还没有去尝试实现,以后有机会了再继续补全好了. 算法分析:三种方法相似,都是按位操作,动态存储.处理好输入数据后,对每一位的逐个操作,很容易得到答案. 大数加法 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define MAX 1010 using n

php如何在某个时间上加一天?一小时? 时间加减(转)

<?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time()),"<br>"; echo "今天:",date("Y-m-d",strtotime("18 june 2008")),"<br>"; echo "昨天:",dat

【算法】大数加减

超长的整型加减法可以用数组int来存储,每个单元可以存储1~9位数字,然后模拟手算过程 大数乘除法,稍复杂,(挖坑)续更.. ====================分割线==================== 1 /************************************************* 2 Copyright: CheerM 3 Author: CheerM 4 Date: 2016-11-02 5 Description: 实现超长int型的加减运算.输入任意长

常见的编程问题(一)少大数加减

存储区的概念 常见的存储区域可分为: 栈 由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,程序会一直占用内存,导致内存泄漏,在程序结束后,操作系统会自动回收. 由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来释放分配的内存. 全局/静态存储区 全局变量和静态变量被分配到同一块内存中,在

POJ 2756 Autumn is a Genius 使用string的大数加减

本题就是说一个小神童,能计算加减法. 不过题目知识说这个小神童,到底有多神,要我们自己发现. 因为最后给出的数据非常非常巨大,听说接近50k就是超过50000个数位相加,可想而知他多神. 看来题目也是考IQ啊! 如果以为是超级水题,按照一般加减法做,肯定是WA了. 这里给出使用string的加减法运算,因为string是长度可增可减的,所以不管是多少位,只要内存支持,那么本算法都可以支持了.也可以使用vector这些容器.不过string应该更加省点内存. 注意: POJ比较讨厌的就是不支持C+

Java中常用加减密方式

1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概述: 单向加密又称为不可逆加密算法,在加密过程中不使用密钥,明文由系统加密成密文,密文无法破解,一般都是采用验证的方式,具体是:在验证过程中,重新输入明文,并经过同样的加密算法后,得到相同的密文.单向加密广泛用于口令加密. 2.2.特点: (1)对同一消息反复执行加密得到相同的密文: (2)加密算法

常用数据结构及算法C#实现

常用数据结构及算法C#实现 1.冒泡排序.选择排序.插入排序(三种简单非递归排序) 1 int[] waitSort = { 1,0, 12, 13, 14, 5, 6, 7, 8, 9, 10 }; 2 3 //冒泡排序 4 int length = waitSort.Length; 5 6 for (int i = 0; i < length; i++) 7 { 8 for (int j = i + 1; j < length; j++) 9 { 10 if (waitSort[j] &g

字符串大数加减运算问题

这里自己利用STL模板中的容器和链表实现字符串大数加减运算. 1 #include<iostream> 2 #include<vector> 3 #include<list> 4 using namespace std; 5 6 list<char> Input_Number(list<char> ilist)//输入链表字符串,以‘#’作为结束符 7 { 8 cout<<"please Input string ,end