c#大数加法

时间:2023-02-25 20:57:32

在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[];
this.length = ;
this.length = theint.Length - ;
for (int i = ; i <= theint.Length - ; i++)
{
this.num[i] = Convert.ToInt32(theint[theint.Length - - 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[];
b.length = ;
b.length = theint.Length - ;
for (int i = ; i <= theint.Length - ; i++)
{
b.num[i] = Convert.ToInt32(theint[theint.Length - - 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 = ; i <= big; i++) {
b3.num[i] += b4.num[i];//加法计算
b3.num[i + ] += b3.num[i] / ;//进位
b3.num[i] %= ; //进位后剩下的
}
//确定更新后的位数
big=;
while (b3.num[big] == &&big!=) {
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 >= ; 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[];
b.length = ;
b.length = theint.Length - ;
for (int i = ; i <= theint.Length - ; i++)
{
b.num[i] = Convert.ToInt32(theint[theint.Length - - 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 >= ; 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~

c#大数加法的更多相关文章

  1. 51nod 1005 大数加法

    #include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...

  2. 玲珑杯1007-A 八进制大数加法(实现逻辑陷阱与题目套路)

    题目连接:http://www.ifrog.cc/acm/problem/1056 DESCRIPTION Two octal number integers a, b are given, and ...

  3. Leetcode 67 Add Binary 大数加法&plus;字符串处理

    题意:两个二进制数相加,大数加法的变形 大数加法流程: 1.倒置两个大数,这一步能使所有大数对齐 2.逐位相加,同时进位 3.倒置两个大数的和作为输出 class Solution { public: ...

  4. HDU1002大数加法

    大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...

  5. java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  6. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  7. 【大数加法】POJ-1503、NYOJ-103

    1503:Integer Inquiry 总时间限制:  1000ms 内存限制:  65536kB 描述 One of the first users of BIT's new supercompu ...

  8. A &plus; B Problem II 大数加法

    题目描述: Input The first line of the input contains an integer T(1<=T<=20) which means the number ...

  9. NI笔试——大数加法

    NI笔试: 1.找出字符串第一次出现的字符.用数组建立哈希表,然后再扫描字符串并判断次数是否为1. 2.大数加法,即字符串加法.因为之前写过乘法,就以为是乘法.然后就把乘法写上去了····= = 好了 ...

随机推荐

  1. java&period;lang&period;IllegalStateException&colon; Web app root system property already set to different value

    webAppRootKey是在java web项目的web.xml配置文件中表示项目的唯一标示,在Eclipse调试Web项目时,项目的路径是一个临时路径,不在真正的路径下,可以通过log4j日志的方 ...

  2. Hibernate入门

    脏检查及刷新缓存机制: 脏检查:当事物提交时,Hibernate会对session中持久状态的对象进行检测, 判断对象的数据是否发生改变 为什么要进行脏检查? 如果对象发生了改变,就需要将改变更新到数 ...

  3. 一行代码解决ie6&comma;7&comma;8&comma;9&comma;10兼容性问题

    "浏览器模式"."文档模式"选项的区别如下: 1."浏览器模式"用于切换IE针对该网页的默认文档模式.对不同版本浏览器的条件备注解析.发送给 ...

  4. cpu主频信息

    yangkunvanpersie ( yangkunvanpersie@163.com ) 通过"有道云笔记"邀请您查看以下笔记 修改CPU频率.note   打开笔记 kerne ...

  5. Mac环境brew安装

    curl -L https://get.rvm.io | bash -s stable //RVM安装 source ~/.rvm/scripts/rvm rvm -v //版本检测 rvm list ...

  6. 【bzoj1911】 Apio2010—特别行动队

    http://www.lydsy.com/JudgeOnline/problem.php?id=1911 (题目链接) 题意 给出一个序列,将序列分成连续的几段,每段的价值为a*s*s+b*s+c,其 ...

  7. 嵌入式中的 &ast;&lpar;volatile unsigned int &ast;&rpar;0x500 解释

    C语言中*(volatile unsigned int *)0x500的解释: 如下: (unsigned int *)0x500:将地址0x500强制转化为int型指针*(unsigned int ...

  8. NopCommerce架构分析&lpar;转载&rpar;

    原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCo ...

  9. iOS开发-使用Storyboard进行界面跳转及传值

    前言:苹果官方是推荐我们将所有的UI都使用Storyboard去搭建,Storyboard也是一个很成熟的工具了.使用Storyboard 去搭建所有界面,我们可以很迅捷地搭建出复杂的界面,也就是说能 ...

  10. MVC 视图不使用模板页的两种方法

    直接对view页面的Layout值设置null @{ Layout = null;//"~/Views/Shared/_Layout.cshtml"; } 对_ViewStart. ...