Calmer的文章

  • 首页
  • 文章归档
  • 关于页面

  • 搜索
体验游戏 笔记 推荐 工具链 工具使用 小游戏 插件 UI 软件 教程

大整数计算法

发表于 2020-09-17 | 分类于 算法 | 0 | 阅读次数 926

前言

在很多时候需要大整数的加减乘除,一下封装了大整数的方法

题目

bignum

代码

using System;
using System.Collections.Generic;
public class Program
{
    public static void Main(string[] args)
    {
	string input = Console.ReadLine();
	string[] val = input.Split(' ');
	Console.WriteLine(StringMul(StringDiv(val[0],"2"),val[1]));
    }

    public static void RemoveZero(ref string a)
    {
        int start=0;
        
        for(int i=0;i<a.Length;i++)
        {
            if(a[i]=='0')
            {
                start++;
            }
            else
            {
                break;
            }
        }
        a =  a.Substring(start);
    }

    public static int Comp(string a,string b)
    {
        RemoveZero(ref a);
        RemoveZero(ref b);
        if(a.Length>b.Length)
        {
            return 1;
        }
        else if(a.Length<b.Length)
        {
            return 2;
        }
        else
        {
            for(int i=0;i<a.Length;i++)
            {
                if(a[i]>b[i])
                    return 1;
                else if(a[i]<b[i])
                    return 2;
            }
            return 0;
        }
    }

    public static string StringAdd(string a, string b)
    {
        RemoveZero(ref a);
        RemoveZero(ref b);
        string result="";
        int flag = 0;
        if(a.Length<b.Length)
        {
            string temp = a;
            a = b;
            b = temp;
        }
        for(int i=1;i<=b.Length;i++)
        {
            int sum = b[b.Length-i] -'0' +a[a.Length-i]-'0' + flag;
            if(sum>=10)
                flag = 1;
            else
                flag = 0;
            result = (char)(sum%10 + '0') + result;
        }
        for(int i=b.Length+1;i<=a.Length;i++)
        {
            int sum = a[a.Length-i]-'0'+flag;
            if(sum>=10)
                flag = 1;
            else
                flag = 0;
            result = (char)(sum%10 + '0') + result;
        }
        if(flag ==1)
        {
            result ='1'+result;
        }
        RemoveZero(ref result);
        return result;
    }

    public static string StringSub(string a,string b)
    {
        string result ="";
        RemoveZero(ref a);
        RemoveZero(ref b);
        int flag =0;
        int compRes = Comp(a,b);
        if(compRes == 0)
            result ="0";
        else if(compRes == 1)
        {
            for(int i=1;i<=b.Length;i++)
            {
                int sub = a[a.Length-i]-b[b.Length-i]-flag;
                if(sub>=0)
                    flag =0;
                else
                {
                    flag = 1;
                    sub = 10 + sub;
                }
                result = (char)(sub+'0') +result;
            }
            for(int i=b.Length+1;i<=a.Length;i++)
            {
                int sub = a[a.Length-i] -'0' -flag;
                if(sub>=0)
                    flag =0;
                else
                {
                    flag = 1;
                    sub = 10 +sub;
                }
                result = (char)(sub+'0') +result;
            }
        }
        else
        {
            for(int i=1;i<=a.Length;i++)
            {
                int sub = b[b.Length-i]-a[a.Length-i]-flag;
                if(sub>=0)
                    flag =0;
                else
                {
                    flag = 1;
                    sub = 10 + sub;
                }
                result = (char)(sub+'0') +result;
            }
            for(int i=a.Length+1;i<=b.Length;i++)
            {
                int sub = b[b.Length-i] -'0' -flag;
                if(sub>=0)
                    flag =0;
                else
                {
                    flag = 1;
                    sub = 10 +sub;
                }
                result = (char)(sub+'0') +result;
            }
            result = "-" + result;
        }
        RemoveZero(ref result);
        return result;
    }

    public static string StringMul(string a,string b)
    {
        RemoveZero(ref a);
        RemoveZero(ref b);
        Dictionary<string,string> mulResult = new Dictionary<string, string>();
        string result ="0";
        string addNum ="0";
        int compRes = Comp(a,b);
        if(compRes==2)
        {
            string temp = a;
            a=b;
            b=temp;
        }
        mulResult.Add("1",a);
        while(Comp(b,"0")!=0)
        {
            if(addNum == "0")
            {
                result = a;
                addNum = "1";
                b = StringSub(b,addNum);
            }
            else
            {
                if(Comp(b,addNum)==1 || Comp(b,addNum)==0)
                {
                    result = StringAdd(result,result);
                    b = StringSub(b,addNum);
                    addNum =StringAdd(addNum,addNum);
                    mulResult.Add(addNum,result);
                }
                else
                {
                    string cur ="1";
                    foreach (string item in mulResult.Keys)
                    {
                        int compRes2 = Comp(b,item);
                        if(compRes2 == 1 || compRes2 == 0)
                        {
                            if(Comp(item,cur)==1)
                            {
                                cur =item;
                            }
                        }
                    }
                    result = StringAdd(result,mulResult[cur]);
                    b = StringSub(b,cur);
                }
            }
        }
        return result;
    }

    public static string StringDiv(string a,string b)
    {
        RemoveZero(ref a);
        RemoveZero(ref b);
        Dictionary<string,string> mulResult = new Dictionary<string, string>();
        string max ="1";
        string result ="0";
        mulResult.Add(max,b);
        while(true)
        {
            string curMax = StringAdd(max,max);
            string value =StringMul(b,curMax);
            if(Comp(a,value)==2)
            {
                break;
            }
            mulResult.Add(curMax,value);
            max = curMax;
        }
        while(Comp(a,b)==1 || Comp(a,b) == 0)
        {
            if(result =="0")
            {
                result =max;
                a =StringSub(a,mulResult[max]);
            }
            else
            {
                string cur ="1";
                foreach (string item in mulResult.Keys)
                {
                    int compRes = Comp(a,mulResult[item]);
                    if(compRes ==1 || compRes ==0)
                    {
                        cur = item;
                    }              
                    else
                        break;      
                }
                a = StringSub(a,mulResult[cur]);
                result = StringAdd(result,cur);
            }
        }
        return result;
    }
}
  • 本文作者: Calmer
  • 本文链接: https://mytechplayer.com/archives/大整数计算
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
ADDRESSABLE ASSETS SYSTEM 翻译(三)
长整型用法
  • 文章目录
  • 站点概览
Calmer

Calmer

88 日志
7 分类
10 标签
RSS
Creative Commons
0%
© 2020 — 2025 Calmer
由 Halo 强力驱动
蜀ICP备20010026号-1川公网安备51019002006543
Copyright © 2020-2025 Calmer的文章