算法---大整数相加

原文:算法---大整数相加

  开通博客开始第一次写发表算法博客。深知一半算法考试都是用C,C++,由于大四开始到今年毕业工作到现在一直从事C#开发,C++用得很少了。链表,指针也只知道一个概念了。用得没以前熟练了。所以后续更新的算法题我都是基于C#语法的。算法主要体现的是解题思路。跟题目一样,本次算法主要实现大数据相加。

解题思路:

1. 将大数据存储到一个链表中,C#中用List<int>来存储,每个节点表示每一位的数字. {1,2,3,4,5} =》12345 和{9,6,5,9,5} =》96595 (C,C++就需要自己通过指针来实现链表功能了。)

      2. 对数据的每一位进行相加。不进行进位操作。{10,8,8,13,10}

    3. 遍历集合,对大于或者等于10的实现进位操作.{1,0,8,9,4,0}

Code 如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BigNumAdd
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<int> num1 = new List<int>() { 1, 2, 3, 4, 5 };
            List<int> num2 = new List<int>() { 9, 6, 5, 9, 5 };
            List<int> sum = AddTwoNum(num1, num2);

            Console.WriteLine(string.Join("", sum));
            Console.ReadKey();
        }

        /// <summary>
        /// 两数字相加
        /// </summary>
        /// <param name="num1"></param>
        /// <param name="num2"></param>
        /// <returns></returns>
        private static List<int> AddTwoNum(List<int> num1, List<int> num2)
        {
            List<int> longNum = null; // 找出长的数字
            List<int> lessNum = null; // 找出短的数字
            if (num1.Count() >= num2.Count())
            {
                longNum = num1;
                lessNum = num2;
            }
            else
            {
                longNum = num2;
                lessNum = num1;
            }

            // 每一位置数据相加,对应前面思路解析第二条
            for (int index = 0; index < lessNum.Count(); index++)
            {
                longNum[longNum.Count() - 1 - index] += lessNum[lessNum.Count() - 1 - index];
            }

            CheckNum(longNum); // 遍历集合实现进位功能.对应前面思路的第三条

            return longNum;
        }

        /// <summary>
        /// 将每一个位置数据大于或等于10的进位
        /// </summary>
        /// <param name="bigNum">大数字</param>
        private static void CheckNum(List<int> bigNum)
        {
            for (int index = bigNum.Count() - 1; index >= 1; index--)
            {
                if (bigNum[index] >= 10)
                {
                    bigNum[index - 1] += bigNum[index] / 10; //进位
                    bigNum[index] = bigNum[index] % 10; // 求余数
                }
            }

            if (bigNum[0] > 10)
            {
                bigNum.Insert(0, bigNum[0] / 10);
                bigNum[1] = bigNum[1] % 10;
            }
        }
    }
}
时间: 2024-10-03 10:26:52

算法---大整数相加的相关文章

SOJ 1002/1003/1004 大整数相加/相乘/相除

三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反过来想到了这几个题目.用JAVA写了以后果然很简单. 1002:大数相加: AC代码: import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { // TO

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

C++ string 实现大整数相加减

任意两个大整数的加减算法,可自动判断正负号,代码如下: #include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <string> using namespace std; string BigInegerAdd(string s1, string s2) // s1+s2; { int len = s1.size()>s2.

实现大整数相加(考虑符号位,可能有负整数) 思维严谨程度!!

//实现大整数相加 //还得考虑符号位,一个比另一个短 #include<iostream> #include <string> #include <cstring> using namespace std; #define maxlen 2001 int a[maxlen]; int b[maxlen]; int len1, len2, i, j; int bigger(int a, int b) { return a>b ? a : b; } void Add

HDU 1002 A + B Problem II(大整数相加)

A + B Problem II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. Input The first line of the input c

ACM: A + B Problem II (两个大整数相加)

Code: #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAX 1000 //给数组赋值 void arrV(int a[],int len,int p){ int i; for(i=0;i<len;i++){ a[i]=p; } } //打印数组中的运算结果 void printRverse(int a[]){ int len=0,i=0; while(a[i]!=-1){

算法-大整数加法

注意这里是整数,浮点数需要额外的操作,实现大整数的加减,三个栈就OK了,两个运算整数栈,一个结果栈,基本的逻辑的就是利用栈的先入后出的特点将高位push到栈底,低位push到栈顶,之后两个栈pop出来之后push到结果栈,结果栈pop出来就是我们想要的结果.看起来还不错,如果有兴趣就看下面的代码,代码通过OC实现,原理类似: 鉴于OC没有Stack,先简单实现一个栈吧: Stack.h: @interface Stack : NSObject //栈顶的元素 @property (strong,

如何实现大整数相加

思路:在程序中列出 "竖式" ,然后逐位相加.究竟是什么样子呢?我们以 426709752318 + 95481253129 为例,来看看大整数相加的详细步骤: 第一步,把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下标位置.之所以倒序存储,更加符合我们从左到右访问数组的习惯. 第二步,创建结果数组,结果数组的最大长度是较大整数的位数+1,原因很明显. 第三步,遍历两个数组,从左到右按照对应下标把元素两两相加,就像小学生计算竖式一样. 例子中,最先相加的是数组A的

大整数相加问题

#include <iostream> #include <string> /*project:两个大整数相加 **@author:浅滩 **data:2019.05.15 */ using namespace std; void add(const string &,const string &); int main() {int n; string str1,str2; cin>>str1>>str2; add(str1,str2); }