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;
            int r = 0;
            int jw = 0;//进位
            do
            {
                if (al > 0 && bl > 0)
                {
                    if (a[al - 1] == ‘.‘)
                    {
                        r = ‘.‘;
                    }
                    else
                    {
                        r = (int)a[al - 1] + (int)b[bl - 1] - 96 + jw;
                        jw = 0;
                        if (r >= 10)
                        {
                            jw++;
                            r = r - 10;
                        }
                    }
                }
                else if (al <= 0 && bl > 0)
                {
                    r = b[bl - 1] - 48 + jw;
                    jw = 0;
                    if (r >= 10)
                    {
                        jw++;
                        r = r - 10;
                    }
                }
                else if (al > 0 && bl <= 0)
                {
                    r = a[al - 1] - 48 + jw;
                    jw = 0;
                    if (r >= 10)
                    {
                        jw++;
                        r = r - 10;
                    }
                }

                if (r == 46)
                {
                    item.Add(Convert.ToChar(r));
                }
                else
                {
                    item.Add(Convert.ToChar(r.ToString()));
                }
                al--; bl--;
            } while (al > 0 || bl > 0);
            if (jw == 1)
            {
                item.Add(‘1‘);
            }
            for (int i = item.Count() - 1; i >= 0; i--)
            {
                ritems.Add(item[i]);
            }
            return ritems.ToArray();
        }

   public static char[] Quadrature(string a, string b)
        {
            char[] r = new char[1] { ‘0‘ };
            List<int> bu = new List<int>();
            List<int> au = new List<int>();
            int bdot = 0;
            int adot = 0;
            for (int i = b.Length - 1; i >= 0; i--)
            {
                if (b[i] == ‘.‘)
                {
                    bdot = i;
                }
                else
                {
                    bu.Add(b[i] - 48);
                }
            }
            for (int i =a.Length - 1; i >= 0; i--)
            {
                if (a[i] == ‘.‘)
                {
                    adot = i;
                }
                else
                {
                    au.Add(a[i] - 48);
                }
            }
            a="";
            for (int i = au.Count() - 1; i >= 0; i--)
            {
                a += au[i];
            }

            for (int i = 0; i < bu.Count(); i++)
            {
                char[] qq = QuadUnit(a, bu[i]);
                string qqq = "";
                for (int j = 1; j < i + 1; j++)
                {
                    qqq = "";
                    foreach (var item in qq)
                    {
                        qqq += item;
                    }
                    qq = QuadUnit(qqq, 10);
                }
                qqq = "";
                foreach (var item in qq)
                {
                    qqq += item;
                }
                string rr = "";
                foreach (var item in r)
                {
                    rr += item;
                }
                r= SumF(rr, qqq);

            }
            char[] re =new char[r.Length+1];
            int jjj = 0;
            for (int i = 0; i < re.Length; i++)
            {
                if (i ==re.Length-(a.Length - adot + b.Length - bdot))
                {
                    if (i != a.Length + b.Length)
                    {
                        re[i] = ‘.‘;
                    }
                }
                else
                {
                    re[i] += r[jjj];
                    jjj++;
                }

            }
            return re;
        }
        public static char[] QuadUnit(string a, int b)
        {
            int r = 0;
            int jw = 0;
            char[] c = a.ToCharArray();
            List<char> items = new List<char>();
            List<char> ritems = new List<char>();
            for (int i = c.Count() - 1; i >= 0; i--)
            {
                if (a[i] == ‘.‘)
                {
                    r = ‘.‘;
                    items.Add(Convert.ToChar(r));
                }
                else
                {
                    r = ((int)c[i] - 48) * b + jw;
                    jw = 0;
                    if (r >= 10)
                    {
                        jw = r / 10;
                        r %= 10;
                    }
                    items.Add(Convert.ToChar(r.ToString()));
                }

            }
            if (jw > 0)
            {
                items.Add(Convert.ToChar(jw.ToString()));
            }

            for (int i = (items.Count() - 1); i >= 0; i--)
            {
                ritems.Add(items[i]);
            }
            return ritems.ToArray();
        }
时间: 2025-01-12 03:30:27

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

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

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

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

直接上代码 实现思路: 1.首先小数点补 位,9223372036854775808.9+9223372036854775808.9223372036854775808 => 9223372036854775808.900000000000000000+9223372036854775808.9223372036854775808 2.然后开始按位进行计算,进位数放入jw,在下一位计算时加上 public static char[] Sum(string a, string b) { retur

高精度乘法程序

对于超过20位的数的乘法问题,我们无法使用普通的方法!!!即使是longlong也会超出范围的!像这样的数,我们只能使用高精度的知识利用数组的方法解决问题!对于高精度乘法的问题,其实思路和高精度加法的思路差不多,都需要使用字符数组来存放每次算完的结果!        1  2  3        *4  5  6    ________________      12  15  18   8  10  124  5   6  _____________________4 13   28   27

[转]高精度乘法计算

转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(Integer Part,IP)与小数部分(Decimal Part,DP)的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数(IxI).整数x小数(IxD)和小数x小数(DxD).用表达式表示, 则FP1*FP2=IP1*IP2+(IP1*DP2+IP2*DP1)+DP1*DP2 (1)对于I

矩阵乘法递推的优化艺术

对于一个线性递推式,求它第项的值,通常的做法是先构造一个的矩阵,然后在时间内求出. 其实,由于这个矩阵的特殊性,可以将时间优化到.接下来我会以一个题目来讲解矩阵乘法递推的优化. 题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1229 题意:设,求的值.其中,和 . 前言:本题如果用普通的矩阵做法,很明显会TLE.那么我们要对这个特殊的矩阵进行时间上的优化. 分析:本题主要可用两种方法解决,分别是错位相减和矩阵乘法

POJ 1306 Combinations 高精度乘法

题目大意:给出mn,让你求C(m,n). 思路:公式都给你了,就100,暴力就可以关键还是高精度.如果按照算法"它让你怎么做你就怎么做",那么很显然你需要写一个高精度除法.然而可以证明,这个除法是不会产生余数的.所以我们可以数论分析,然后避免高精度除法. 方法就是暴力求每个数的质因数,然后把被除数和除数相同的质因数消去,最后除数肯定会被消没.这样只要做高精度乘法就可以了. CODE: #include <cstdio> #include <cstring> #i

poj1001(高精度乘法)

1.题目表述 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 135893   Accepted: 33256 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation o

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

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

真真真&#183;?高精度乘法!!!!!

RX-0奉上哈哈哈哈哈哈哈哈哈哈哈哈哈™™™ 先奉上真真真·高精度乘法源代码: 高精度乘法 RX-0制作最后修改:2016年7月6日#include<stdio.h>#include<string.h>#include<math.h>char s[10000],b;int a[10000];int c[10000];int main(){ int x,l=0,y=1,i,j,m,l1=0; long long s1=0; //freopen("hp.in&qu