• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#大数加法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在C#中,我们经常需要表示整数。但是,c#的基本数据类型中,最大的long也只能表示-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807之间的数。货币类型也不是无限大。如果我们需要表示更大的数,就需要用到一定的算法来完成。

这次,我和大家一起讨论一下c#的大数运算之加法。

这次,我们只考虑正数的整数加法。

我们的代码要封装到一个结构里面。这个结构的结构先摆出来。

 public struct BigInt
        {
          
            public int[] num  ;
            public int length ;
          
           
         }        

我们的思路是读取一个string表示的大数,然后通过算法来计算,返回一个string类型的结果。

为了便于计算,我们首先要把赋值过来的的string转换为一个int数组。这个数组就是代码里的num[]数组。

我们要把这个数的个位存到num[0]里,十位存到num[1]里,以此类推。于是我添加了一个构造函数。

  public BigInt(string theint):this()
            {
           
               
                this.num = new int[200];
                this.length = 0;
                this.length = theint.Length - 1;
                for (int i = 0; i <= theint.Length - 1; i++)
                {
                    this.num[i] = Convert.ToInt32(theint[theint.Length - 1 - i].ToString());
                
                }
            }

例如 调用BigInt(“123”) 时,num[0]=3,num[1]=2,num[2]=1 length=2 (为了方便,这里的length是指数组的坐标上限,不是数组元素的个数)

我们如果能直接把string赋给BigInt类型的变量该多方便啊,那么我们现在就来实现它。 怎么实现呢?其实把一种数据类型变量赋值给另一种时,都需要转换,为什么有的可以直接赋值呢,是因为这里进行的是隐式转换。所以我们就来编写从string到BigInt的隐式转换。代码和构造函数类似。

 public static implicit operator BigInt(string theint)
            {
                BigInt b = new BigInt();
               
                b.num = new int[200];
                b.length = 0;
                b.length = theint.Length - 1;
                for (int i = 0; i <= theint.Length - 1; i++)
                {
                    b.num[i] = Convert.ToInt32(theint[theint.Length - 1 - i].ToString());
                
                }
                return b;
            }

implicit说明转换方式是隐式转换。operator是各种转换和操作符的标志。

当然,较小的数也可以直接从int转过来。所以再写一个int=>BigInt的隐式转换。

 public static implicit operator BigInt(long theint2)
            {
                string theint = theint2.ToString();
               
              
                return theint;
            }

 

准备工作做好了,现在开始计算过程。

在这里,我们通过模拟学生列竖式的方法来计算。首先要从最低位也就是个位加起,满10要向高位进1,也就是数组的下一个元素的值加一。我们直接重写+操作符,代码见下

  public static BigInt operator +(BigInt b1, BigInt b2)
            {
                BigInt b3 = b1;//要返回的加法结果
                BigInt b4 = b2;
                int big = b3.length > b4.length ? b3.length : b4.length;//获取两个加数的最高位数,从0到最高位数依次加法
                

                for ( int i = 0; i <= big; i++) {
                    b3.num[i] += b4.num[i];//加法计算
                    b3.num[i + 1] += b3.num[i] / 10;//进位
                    b3.num[i] %= 10; //进位后剩下的
                } 
                //确定更新后的位数
                big=199;
                while (b3.num[big] == 0&&big!=0) {
                    big--;
                }
                b3.length = big;
                return b3;
            }

 

 public static BigInt operator +(BigInt b1, BigInt b2)这一句,BigInt是加法返回的结果的类型;operator +说明重写的是加法,(BigInt b1, BigInt b2)是两个加数。计算原理是竖式的加法计算。
代码里我加入了注释,应该可以看懂

最后,为了显示BigInt类型的值,我们编写一个由BigInt到string的隐式转换。

public static implicit operator string(BigInt theint)
            {
                string b = "";
              
                for (int i = theint.length; i >=0 ; i--)
                {
                    b += theint.num[i].ToString();
                }
                return b;
            }

由于存入数组时时从低位到高位的,所以我们输出string时要反转回来。

至此,大数加法编写完成。下面是代码清单。

public struct BigInt
        {
          
            public int[] num  ;
            public int length ;
            #region 初始赋值
            
            public BigInt(string s):this()
            {
                this = s;
            }
            public static implicit operator BigInt(string theint)
            {
                BigInt b = new BigInt();
               
                b.num = new int[200];
                b.length = 0;
                b.length = theint.Length - 1;
                for (int i = 0; i <= theint.Length - 1; i++)
                {
                    b.num[i] = Convert.ToInt32(theint[theint.Length - 1 - i].ToString());
                
                }
                return b;
            }
            public static implicit operator BigInt(long theint2)
            {
                string theint = theint2.ToString();
               
              
                return theint;
            }
            #endregion
           
            public static implicit operator string(BigInt theint)
            {
                string b = "";
              
                for (int i = theint.length; i >=0 ; i--)
                {
                    b += theint.num[i].ToString();
                }
                return b;
            }

           
 public static BigInt operator +(BigInt b1, BigInt b2)
            {
                BigInt b3 = b1;//要返回的加法结果
                BigInt b4 = b2;
                int big = b3.length > b4.length ? b3.length : b4.length;//获取两个加数的最高位数,从0到最高位数依次加法
                

                for ( int i = 0; i <= big; i++) {
                    b3.num[i] += b4.num[i];//加法计算
                    b3.num[i + 1] += b3.num[i] / 10;//进位
                    b3.num[i] %= 10; //进位后剩下的
                } 
                //确定更新后的位数
                big=199;
                while (b3.num[big] == 0&&big!=0) {
                    big--;
                }
                b3.length = big;
                return b3;
            }
} 

另外注,此贴纯属技术研究,如需大数运算,.net有专门的类型,无需自己写代码。至于类型是什么,你们自己去找吧。O(∩_∩)O~


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#实现打印发布时间:2022-07-13
下一篇:
C#列表所有IIS站点以及相关站点属性发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap