C# 高精度加法 支持小数(待优化)

直接上代码

实现思路:

1、首先小数点补 位,9223372036854775808.9+9223372036854775808.9223372036854775808 => 9223372036854775808.900000000000000000+9223372036854775808.9223372036854775808

2、然后开始按位进行计算,进位数放入jw,在下一位计算时加上

   public static char[] Sum(string a, string b)
        {
            return Sum(a.ToCharArray(), b.ToCharArray());
        }
        public static char[] Sum(char[] a, char[] b)
        {
            char[] c = a;//补位后的a
            char[] d = b;//补位后的b
            int alength = a.Count();//a长度
            int blength = b.Count();//b长度
            int adot = alength;//a小数点位置
            int bdot = blength;//b小数点位置
            #region 小数点补位
            for (int i = 0; i < alength; i++)
            {
                if (a[i] == ‘.‘)
                {
                    adot = i;
                    break;
                }
            }
            for (int i = 0; i < blength; i++)
            {
                if (b[i] == ‘.‘)
                {
                    bdot = i;
                    break;
                }
            }
            if (adot != alength || bdot != blength)
            {
                if (adot == alength)
                {
                    c = new char[alength + 1 + blength - bdot - 1];
                    for (int i = 0; i < c.Length; i++)
                    {
                        if (i < alength)
                        {
                            c[i] = a[i];
                        }
                        else if (i == alength)
                        {
                            c[i] = ‘.‘;
                        }
                        else
                        {
                            c[i] = ‘0‘;
                        }
                    }

                }
                else if (bdot == blength)
                {
                    d = new char[blength + 1 + alength - adot - 1];
                    for (int i = 0; i < d.Length; i++)
                    {
                        if (i < blength)
                        {
                            d[i] = b[i];
                        }
                        else if (i == blength)
                        {
                            d[i] = ‘.‘;
                        }
                        else
                        {
                            d[i] = ‘0‘;
                        }
                    }
                }
                else
                {
                    if (alength - adot > blength - bdot)
                    {
                        d = new char[blength + ((alength - adot) - (blength - bdot))];
                        for (int i = 0; i < d.Length; i++)
                        {
                            if (i < blength)
                            {
                                d[i] = b[i];
                            }
                            else
                            {
                                d[i] = ‘0‘;
                            }
                        }
                    }
                    else
                    {
                        c = new char[alength + ((blength - bdot) - (alength - adot))];
                        for (int i = 0; i < c.Length; i++)
                        {
                            if (i < alength)
                            {
                                c[i] = a[i];
                            }
                            else
                            {
                                c[i] = ‘0‘;
                            }
                        }
                    }
                }
            }

            #endregion

            List<char> item = new List<char>();
            int cl = c.Length;
            int dl = d.Length;
            int r = 0;
            int jw = 0;//进位
            do
            {
                if (cl > 0 && dl > 0)
                {
                    if (c[cl - 1] == ‘.‘)
                    {
                        r = ‘.‘;
                    }
                    else
                    {
                        r = (int)c[cl - 1] + (int)d[dl - 1] - 96 + jw;
                        jw = 0;
                        if (r >= 10)
                        {
                            jw++;
                            r = r - 10;
                        }
                    }
                }
                else if (cl <= 0 && dl > 0)
                {
                    r = d[dl - 1] - 48;
                }
                else if (cl > 0 && dl <= 0)
                {
                    r = c[cl - 1] - 48;
                }

                if (r == 46)
                {
                    item.Add(Convert.ToChar(r));
                }
                else
                {
                    item.Add(Convert.ToChar(r.ToString()));
                }
                cl--; dl--;
            } while (cl > 0 || dl > 0);
            if (jw == 1)
            {
                item.Add(‘1‘);
            }
            return item.ToArray();
        }
时间: 2024-10-10 10:00:51

C# 高精度加法 支持小数(待优化)的相关文章

C# 高精度乘法 支持小数(待优化)

将N*N乘法转化为(N*n1)+(N*n2)....(N*nn) 乘完后在补充小数点 public static char[] SumF(string a, string b) { BuweiF(ref a, ref b);//小数点后补位 List<char> item = new List<char>(); List<char> ritems = new List<char>(); int al = a.Length; int bl = b.Length

C# 高精度减法 支持小数(待优化)

是现实思路 1,先小数点补位,8913758923475893274958738945793845-4893127498372459823745324532453245.284929384729837498237492 => 8913758923475893274958738945793845.000000000000000000000000-4893127498372459823745324532453245.284929384729837498237492. 2,进行计算,最后补符号 pub

问题 B: 【高精度】简单高精度加法

问题 B: [高精度]简单高精度加法 时间限制: 1 Sec  内存限制: 64 MB提交: 94  解决: 27[提交][状态][讨论版] 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222

C语言(7)--高精度加法、减法、乘法、今天是星期几、四位平方数、候选人选票问题

1.高精度加法.减法.乘法 #include <stdio.h> #include <string.h> #include <malloc.h> void plus(char *a,char *b,char *c);//自定义高精度加法函数 void sub(char *a,char *b,char *c);//自定义高精度减法函数 void multiply(char *a,char *b,char *c);//自定义高精度乘法函数 int main() { char

中石油-【高精度】简单高精度加法

问题 B: [高精度]简单高精度加法 时间限制: 1 Sec  内存限制: 64 MB提交: 63  解决: 20[提交][状态][讨论版] 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222

leetcode 66. Plus One(高精度加法)

Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored such that the most significant digit is at the head of the list. 题解:简单的高精度加法,要注意[9]这种输入,要多一位. class Solution { public: vector<int> plusOne(v

【1002】高精度加法,此处应有掌声~(*/ω\*)

木有求助别人然后AC..... 打完了上面这一行我都羞愧(*/ω\*)谁叫我是蒟蒻呢 先上我滴最终代码 1 #include<stdio.h>//高精度加法 2 #include<string.h> 3 4 char ar[1001],br[1001]; 5 int a,b; 6 7 void exchange() 8 { 9 char cr[1001];int c; 10 strcpy(cr,ar); 11 strcpy(ar,br); 12 strcpy(br,cr); 13

C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 大数据支持分表优化

公司的短信平台,数据量越来越大了,需要对数据进行一些优化,下面是拆分后的数据库量参考. 新开发的软件模块,必须支持分表,拆表的功能一个数据表里,不适合保存1000万以上的记录新开发的业务模块,能分表的全分表,否则,将来我们无法用其他小型数据库,例如mysql 现在系统的短信已经进行了拆表接着打算把日志也进行拆表确保数据库里,没有庞大的表,随时可以切换数据库 每个人把自己负责的事情,做到自己能力的及至,做到部门能力的及至,公司能力的及至,就很有希望了有时候我说话很随意,但是一般会注意,我说出去的话

一、四则运算栈实现,支持小数、负数

四则运算栈实现,支持小数.负数,经过测试,暂时没发现错误! 思路: 1.去掉字符串中的空格,将字符串按照运算符和数字保存到vector<string>中: 2.判断字符串是否符合四则运算的表达式: 3.栈实现:数字栈.运算符栈,从左到右扫描中缀表达式: 数字:直接入栈:运算符: (1)”(“:直接入栈: (2)”)“:弹出()之间的运算符,进行运算: (3)”+-*/“:如果当前运算符优先级<栈顶运算符优先级,则数字栈弹出两个数和栈顶运算符进行运算,并将结果存入数字运算符,再将当前运算符