`
gaojingsong
  • 浏览: 1182003 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

用字符串模拟两个大数相加

阅读更多
 package cn.com.hadoop;
/**
* 用字符串模拟两个大数相加,计算机中整型数据都是有范围的,不能无限大;突然想到了小学时候的列竖式进行笔算
* @author gaojingsong
*/
public class Demo {
/**             1897
  思路:         +   56                                                
      
1.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;(1897,0056) 
2.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;(7981,,65 00)    
   3.把两个正整数相加,一位一位的加并加上进位。 
         (7+6=13  9+5+进位1=15 8+0+进位1=9 1+0=1)  
         3        5         9           1 因此结1953                  
  */
public static void main(String[] args) {
  add("991","23");
  add("1897","56");
  //java.math.BigInteger a2 = new java.math.BigInteger(a);
}
/**
  * 1、取得两个字符串的长度,把长度较短的字符串,在左面补0,使之与较长字符串一样长
   * 2、长度相同反转字符串,从个位开始进行累加,字符串每位取出来相加,
       如果大于10则进位,结果位为相加和减去10
  * @param n1
  * @param n2
  * @return
  */
public static String add(String n1, String n2) {
  StringBuffer result = new StringBuffer();
  // 一、反转
  StringBuffer num1 = new StringBuffer(n1).reverse();
  StringBuffer num2 = new StringBuffer(n2).reverse();
  // 二、补齐,把两个字符串补齐,即短字符串(反转后短字符串的最低位)的高位用0补齐,
  int len1 = num1.length();
  int len2 = num2.length();
  int maxlength = len1 > len2 ? len1 : len2;
  if (len1 > len2) {
   for (int i = len2; i < len1; i++) {
    num2.append(0);
   }
  } else if (len1 < len2) {
   for (int i = len1; i < len2; i++) {
    num1.append(0);
   }
  }
  // 三、逐位相加,把两个正整数相加,一位一位的加并加上进位
  int overNum = 0;      //溢出数量,个位数相加最多进一位
  boolean hinghtLocOverFlow = false;//是否越界
  for (int i = 0; i < maxlength; i++) {
   int num3 = overNum
     + Integer.parseInt(String.valueOf(num1.charAt(i) + ""))
     + Integer.parseInt(String.valueOf(num2.charAt(i) + ""));
   if (num3 >= 10) {
    result.append(num3 - 10);
    overNum = 1;//每位相加满十则进一
    //判断最后一位是否会溢出满10,满十则进一位
    if (i == maxlength-1) {
     hinghtLocOverFlow = true;
    }
   } else {
    overNum = 0;
    result.append(num3);
   }
   //如果溢出的话表示位增加了
   if (hinghtLocOverFlow) {
    result = result.append(1);
   }
  }
  String res = result.reverse().toString();
  System.out.println(res);
  return res;
}
}
分享到:
评论

相关推荐

    用C语言编写两个大数相加

    - 初始化:创建两个数组分别存储两个大数,以及一个数组用于存储结果。 - 搭配进位:从低位到高位,逐位进行加法运算,同时考虑当前位的进位。对于每一位,我们只需处理两个数组对应位置的元素加上上一位的进位值...

    大数处理问题(就是用字符串)

    比较两个大数可以通过`Cmp`函数实现,从最高位(字符串末尾)开始逐位比较,如果某一位数值不相等,则返回相应的正负值表示大小关系;若所有位都相等且长度也相等,则认为两个大数相等。 3. **大数加法**: 大数...

    C++实现大数相加

    1. **初始化**:将两个大数(以字符串形式)反转,这样我们可以从低位开始处理。反转的原因是C++字符串的索引是从0开始的,这样可以避免从高位开始遍历时的负索引问题。 2. **遍历**:从每一位开始(从末尾开始,即...

    c 语言实现1000位数的两个数相加

    这个函数将接收两个字符串参数,分别表示两个大数,并返回一个新的字符串表示它们的和。为了处理可能产生的进位,我们需要从低位到高位逐位进行加法运算。这里可以采用类似于手工竖式加法的方法: 1. 初始化两个...

    《大数相加模板》.doc

    这里的`add`函数接收两个字符串形式的大数(即字符数组)`a`和`b`作为参数,返回它们相加后的结果。 1. 计算长度: 函数通过`strlen`函数分别获取`a`和`b`的长度,存储在`m`和`n`中。这两个值用于后续遍历数组时的...

    用c语言实现大数相乘

    - `#define MULMAXLEN (INTMAXLEN - 1) * 2 + 1`: 由于两个大数相乘的结果可能比原数更长,这里定义了结果字符串的最大长度。 - 函数原型定义: - `int insert0(char bufa[MULMAXLEN-1], char a[MULMAXLEN-1], int ...

    java实验大数相加.doc

    - 使用两个字符串表示大整数。 - 将字符串转换为字符数组,每个字符代表一个十进制位。 - 从低位到高位依次相加,同时处理进位。 - 将最终结果转换回字符串形式输出。 **示例代码片段**: ```java public ...

    大数相乘c语言

    2. **初始化大数**:在开始计算前,我们需要创建两个大数数组,并将输入的数转换成对应的数组形式。如果输入是字符串,我们可以遍历字符串,逐位将数字存入数组。 3. **数组乘法算法**:常见的算法有Karatsuba算法...

    大数运算 加减乘除

    1. **加法**:两个大数相加类似于小学数学中的竖式加法,从低位向高位逐位相加,同时考虑进位。如果两个数的位数不同,只需将较短的数前面补零即可对齐。 2. **减法**:类似加法,但需要注意借位处理。如果被减数...

    大数的处理

    在编程中,我们可以使用两个指针分别遍历两个大数,进行逐位加法,并处理进位。例如,在Python中,可以直接使用内置的`+`运算符进行大数加法。 三、大数的减法 大数减法类似加法,只是需要处理借位问题。如果被减数...

    关于c语言百位大数

    例如,两个大数相加时,需要从低位到高位逐位进行,如果有进位,则需要向更高位传递。 3. **字符串转换**:为了输入和输出大数,我们需要将大数与字符串之间进行转换。可以使用`scanf`和`printf`函数配合格式化字符...

    大数的四则运算

    在主循环中,输入两个大数字符串sa和sb,先对它们进行反转,然后逐位相加,如果某位相加大于9,则进位。最后,再反转结果并输出。 2. 大数的减法: 大数的减法类似于加法,但需要注意借位处理。同样,代码中使用了...

    大数加减法

    6. **`main`函数**:程序入口点,读取用户输入的两个大数字符串,调用上述函数完成大数运算,并输出结果。 #### 4. 结论 通过上述C语言实现,我们可以有效地处理大数的加法、减法和乘法运算,这对于解决超出标准...

    C语言-大数乘法

    1. 初始化:为两个大数分配足够大小的unsigned char数组,并将16进制字符串转换成对应的二进制表示。 2. 垂直乘法:遍历每个乘数的位,对另一个乘数进行逐位乘法,结果是一个二维数组,其中每个元素代表对应位的...

    c语言高精度运算,全加器模拟程序

    在提供的代码示例中,可以看到一个使用C语言编写的全加器模拟程序,它实现了对两个字符串表示的大数进行加法运算。程序首先读取两个字符串形式的数字,然后通过比较它们的长度来确定较长的那个作为基准。接下来,...

    大数加法1

    在这种情况下,我们通常会将大数表示为字符串,然后逐位进行相加。这种方法称为模拟加法,是处理大数运算的基本方法之一。 大数加法的步骤大致如下: 1. **读取输入**:程序需要从输入中读取两个正整数a和b,这里...

    用mfc实现的大数类

    成员变量可能是字符串或者数组形式,用来保存每一位数字,因为大数可能会有多个字节或字组成。 对于加法、减法和乘法这些运算,大数类通常会提供相应的成员函数。这些函数可能采用位操作、模拟传统算术运算或者使用...

    ACM教程-大数问题

    代码首先读取两个输入的大数(以字符串形式),然后初始化两个大数的数组,将字符串中的每一位转换为整数。接下来,通过遍历两个数组,逐位相加,并处理进位。最后,将结果输出。 ```cpp #include #include using...

    超大数据,高精度加法和高精度阶乘运算

    本篇将详细讲解如何使用字符串模拟大数的加法以及实现高精度阶乘运算。 首先,我们来看高精度加法。在给定的代码中,`add`函数实现了两个字符串形式的大数相加。这个函数的实现思路是首先确保两个字符串长度相同,...

    大数运算c++

    大数加法和减法的基本思想是将两个大数对齐,然后按位相加或相减,同时考虑进位或借位。乘法通常是通过Karatsuba算法或更高级的快速乘法方法来提高效率,而除法则可能使用长除法算法,逐位计算商并处理余数。 矩阵...

Global site tag (gtag.js) - Google Analytics