精华内容
下载资源
问答
  • 大数相减

    2021-01-10 08:06:13
    大数相减前言代码如下:总结 前言 两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如Java.math.BigInteger等。 代码如下: #include<bits/stdc++.h> using namespace std; ...


    前言

    两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如Java.math.BigInteger等。


    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    
    string substract(string s1, string s2)
    {
        string s3;
        int len1=s1.size()-1;
        int len2=s2.size()-1;
        string str="";   //用来储存结果
        while(len1>=0&&len2>=0)
        {
            int t=s1[len1]-s2[len2];  //储存此位的结果
            if(t<0)   //如果t<0代表需要进借位
            {
                t+=10;
                if(s1[len1-1]=='0') //如果上位等于0,则需要再往上一位借
                {
                    int len=len1-1;
                    while(len--)  //直到某一上位不为0
                    {
                        if(s1[len]!='0')
                            break;
                    }
                    for(int i=len+1;i<=len1-1;i++)  //从不为0的上位的下一位到需要借位的上一位均变为9
                        s1[i]='9';
                    s1[len]--;   //不为0的上位减一;
                }
                else     //上位不为0则直接减一
                    s1[len1-1]--;
            }
            str+=t+'0';  //此位的结果储存到字符串str里
            len1--;
            len2--;
        }
        while(len1>=0)   //如果len1最后不为0,把s1剩余的位数拷贝到str里
        {
            str+=s1[len1];
            len1--;
        }
        int i;
        reverse(str.begin(),str.end()); //因为我们是从个位开始往后存储的,所以需要给结果逆序
        for(i=0;i<str.size();i++)   //判断前导是否为0
            if(str[i]!='0')
                break;
        if(i==str.size())   //如果str所有位数均为0则结果为0
            return "0";
        else        //反之删除前导0
            str.erase(str.begin(),str.begin()+i);
        return str;
    }
    int main()
    {
    	string s1,s2;
    	cin>>s1>>s2;
    	int flag=0;
    	if(s1.size()<s2.size())
    	{
    		flag=1;
    		string s;
    		s=s1;
    		s1=s2;
    		s2=s;
    	}
    	else if(s1.size()==s2.size())
    	{
    		for(int i=0;i<s1.size();i++)
              {
                if(s1[i] == s2[i])
                    continue;
                if(s1[i]<s2[i])
                {
                	flag=1;
    				string s;
    				s=s1;
    				s1=s2;
    				s2=s;
                }
                else
                    break;
              }
    	}
    	if(flag==1)
    	{
    		cout<<"-"; 
    	} 
    	string str=substract(s1,s2);
    	cout<<str<<endl; 
    	return 0;
    } 
    

    总结

    大数相减要考虑借位,和负数的问题。仍然使用字符串来进行存储。

    展开全文
  • java大数相减代码

    2017-11-29 20:12:34
    java实现大数相减,在不使用BigInteger工具的前提下实现大数相减
  • packagecn.yunmanage.haikang;publicclassBigNumberAdd{publicstaticvoidmain(String[]args){System.out.println(bigNumberAdd("111","999"));}publicstaticStringbigNumberAdd(Stringf,Strings){/...

    package cn.yunmanage.haikang;

    public class BigNumberAdd {

    public static void main(String[] args) {

    System.out.println(bigNumberAdd("111", "999"));

    }

    public static String bigNumberAdd(String f, String s) {

    // 翻转两个字符串,并转换成数组

    char[] a = new StringBuffer(f).reverse().toString().toCharArray();

    char[] b = new StringBuffer(s).reverse().toString().toCharArray();

    int lenA = a.length;

    int lenB = b.length;

    // 计算两个长字符串中的较长字符串的长度

    int len = lenA > lenB ? lenA : lenB;

    int[] result = new int[len + 1];// 长度为len+1(由于可能有进位)

    for (int i = 0; i 

    // 若是当前的i超过了其中的一个,就用0代替,和另外一个字符数组中的数字相加

    int aint = i 

    int bint = i 

    result[i] = aint + bint;

    }

    // 处理结果集合,若是大于等于10的就向前一位进位,自己进行除10取余

    for (int i = 0; i 

    if (result[i] >= 10) {

    result[i + 1] += result[i] / 10;

    result[i] %= 10;

    }

    }

    StringBuffer sb = new StringBuffer();

    // 该字段用于标识是否有前置0,若是有就不要存储

    boolean flag = true;

    for (int i = len; i >= 0; i--) {

    if (result[i] == 0 && flag) {

    continue;

    } else {

    flag = false;

    }

    sb.append(result[i]);

    }

    return sb.toString();

    }

    }

    package cn.yunmanage.haikang;

    public class BigNumberSub {

    public static void main(String[] args) {

    System.out.println(bigNumberSub02("99", "2222"));

    }

    public static String bigNumberSub(String f, String s) {

    System.out.print("减法:" + f + "-" + s + "=");

    // 将字符串翻转并转换成字符数组

    char[] a = new StringBuffer(f).reverse().toString().toCharArray();

    char[] b = new StringBuffer(s).reverse().toString().toCharArray();

    int lenA = a.length;

    int lenB = b.length;

    // 找到最大长度

    int len = lenA > lenB ? lenA : lenB;

    int[] result = new int[len];

    // 表示结果的正负

    char sign = '+';

    // 判断最终结果的正负

    if (lenA 

    sign = '-';

    } else if (lenA == lenB) {

    int i = lenA - 1;

    while (i > 0 && a[i] == b[i]) {

    i--;

    }

    if (a[i] 

    sign = '-';

    }

    }

    // 计算结果集,若是最终结果为正,那么就a-b不然的话就b-a

    for (int i = 0; i 

    int aint = i 

    int bint = i 

    if (sign == '+') {

    result[i] = aint - bint;

    } else {

    result[i] = bint - aint;

    }

    }

    // 若是结果集合中的某一位小于零,那么就向前一位借一,而后将本位加上10。其实就至关于借位作减法

    for (int i = 0; i 

    if (result[i] 

    result[i + 1] -= 1;

    result[i] += 10;

    }

    }

    StringBuffer sb = new StringBuffer();

    // 若是最终结果为负值,就将负号放在最前面,正号则不须要

    if (sign == '-') {

    sb.append('-');

    }

    // 判断是否有前置0

    boolean flag = true;

    for (int i = len - 1; i >= 0; i--) {

    if (result[i] == 0 && flag) {

    continue;

    } else {

    flag = false;

    }

    sb.append(result[i]);

    }

    // 若是最终结果集合中没有值,就说明是两值相等,最终返回0

    if (sb.toString().equals("")) {

    sb.append("0");

    }

    // 返回值

    System.out.println(sb.toString());

    return sb.toString();

    }

    }

    展开全文
  • 大数相加和大数相减

    2020-10-31 13:42:51
    1,大数相减 大整数相减。有两个非常大的整数,因为太大所以用数组保存,计算大数相减的结果。 vector<string> bigint_subtraction(vector<int>& nums, int target) { vector<int> A = {1,3,...

    1,大数相减
    大整数相减。有两个非常大的整数,因为太大所以用数组保存,计算大数相减的结果。
    减法操作是需要提前判断出大一点的那个数的。

    vector<string> bigint_subtraction(vector<int>& nums, int target) {
        vector<int> A = {1,3,4,6,8};
        vector<int> B = {1,3,4,6,9};
        //将大的值变成A,小一些的值变成B
        int asize = A.size(),bsize = B.size();
        bool b_above_a = false;
        if (bsize==asize) {
            for (int i=0;i<asize;i++) {
                if (B[i]>A[i]) {
                    b_above_a = true;
                    break;
                }
            }
        }
        if (b_above_a || bsize>asize) {
            vector<int> temp = B;
            B = A;
            A = temp;
            b_above_a = true;
        }
        //用大数减去小数,使用借位符查看是不是需要借位
        int jieweifu = 0;
        vector<int> result;
        int i=A.size()-1,j=B.size()-1;
        //A中的数减去B中的数
        for (;j>=0;i--,j--) {
            int num_a = A[i] - jieweifu;
            int diff = num_a - B[j];
            if (diff < 0) {
                jieweifu = 1;
                diff += 10;
            }
            else
                jieweifu = 0;
            result.push_back(diff);
        }
        //若A中的数还有,则继续跟进位符做判断
        for (;i>=0;i--) {
            int diff = A[i] - jieweifu;
            if (diff < 0) {
                jieweifu = 1;
                diff += 10;
            }
            else
                jieweifu = 0;
            result.push_back(diff);
        }
        //将结果数组末尾的0去掉
        for (int i=result.size()-1;i>0;i--) {
            if (result[i]==0) 
                result.pop_back();
            else
                break;
        }
        //将结果数组反转,并根据正负加上符号;
        vector<string> new_result;
        if (b_above_a) 
            new_result.push_back("-");
        for (int i=result.size()-1;i>=0;i--) 
            new_result.push_back(to_string(result[i])); 
        cout<<"new_result:";
        for (int i=0;i<new_result.size();i++) 
            cout<<new_result[i]; 
        return new_result;
    }
    

    2,大数相加
    两个很大很大的正整数,将之保存在数组中,求两数相加之和
    解题思路:解题思路:A,B和进位符相加,将余数保存起来,并更新进位符;将剩余的数组转变成A,将A继续与进位符一起遍历,并将结果数据保存起来。

    vector<int> bignum_add() {
        //大数相加
        vector<int> A = {3,4,6,8};
        vector<int> B = {6,3,4,6,9};
        //大数和进位符相加
        int jinweifu = 0;
        vector<int> result;
        int i=A.size()-1,j=B.size()-1,remainder;
        for (;j>=0 && i>=0;i--,j--) {
            int num_sum = A[i] + B[j] + jinweifu;
            remainder = num_sum%10;
            jinweifu = num_sum>=10?1:0;
            result.push_back(remainder);
        }
        //默认A中数据比较大,若B的数据比较大,就把B赋值给A,然后A与进位符一起操作后加入到result     
        if (j>0) {
            i=j;
            A=B;
        }          
        for (;i>=0;i--) {
            int num_sum = A[i] + jinweifu;
            remainder = num_sum%10;
            jinweifu = num_sum>=10?1:0;
            result.push_back(remainder);
        }       
        //若最后一位计算完之后还有数据就在末尾加1
        if (jinweifu>0) 
            result.push_back(1);
        //将结果数据反转
        vector<int> new_result;
        for (int i=result.size()-1;i>=0;i--) 
            new_result.push_back(result[i]); 
        cout<<"new_result:";
        for (int i=0;i<new_result.size();i++) 
            cout<<new_result[i]; 
        return new_result;
    }
    
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 400
精华内容 160
关键字:

大数相减