zoukankan      html  css  js  c++  java
  • 大数据相乘

      下面是我写的一个关于大数据相乘的算法,核心思想就是通过小学竖式乘法进行运算,具体代码C#如下所示:

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace BigNumberMultiplication
    7 {
    8 class Program
    9 {
    10 static void Main(string[] args)
    11 {
    12 try
    13 {
    14 int first = 4916;
    15 int second = 12345;
    16 long result = first * second;
    17 Console.WriteLine(string.Format("{0} * {1} = {2}\n\n", first.ToString(), second.ToString(), result.ToString()));
    18
    19 string firstStr = "100000000000000000000";
    20 string secondStr = "100000000000000000000";
    21 string resultStr = MultipFunction(firstStr, secondStr);
    22 Console.WriteLine("The result is: {0}", resultStr.TrimStart('0'));
    23 Console.WriteLine("The length of the result is: {0}", resultStr.TrimStart('0').Length);
    24 Console.ReadKey();
    25 }
    26 catch (Exception ex)
    27 { }
    28 }
    29
    30 //大数据乘法
    31 private static string MultipFunction(string firstNumStr, string secondNumStr)
    32 {
    33 try
    34 {
    35 int firstNumLength = firstNumStr.Length;
    36 int secondNumLength = secondNumStr.Length;
    37 int resultNumLength = firstNumLength + secondNumLength;
    38 int[] firstNumValue = new int[firstNumLength];
    39 int[] secondNumValue = new int[secondNumLength];
    40 int[] resultNumValue = new int[resultNumLength];
    41 //遍历字符串,将每一位的字符转换成为int整形插入整形数组中
    42 for (int i = 0; i < firstNumLength; i++)
    43 {
    44 firstNumValue[i] = firstNumStr[i] - 48;
    45 }
    46 for (int i = 0; i < secondNumLength; i++)
    47 {
    48 secondNumValue[i] = secondNumStr[i] - 48;
    49 }
    50 //定义的整形数组初始化各个位就是0;所以下面赋0的过程可以省略
    51 for(int i = 0; i < resultNumLength; i++)
    52 {
    53 resultNumValue[i] = 0;
    54 }
    55
    56 //算法的核心(小学笔算乘法的流程),将两个数按位进行相乘-->组合成结果的整形数组
    57 //然后对此结果整形数组进行遍历,结果的低位取整附加给临近的高位,低位取余赋给本低位(注:这里说的低位恰好是数组的高位,即数组下标大的位)
    58 for (int i = firstNumLength - 1; i >= 0; i--)
    59 {
    60 for (int j = secondNumLength - 1; j >= 0; j--)
    61 {
    62 resultNumValue[i + j + 1] += firstNumValue[i] * secondNumValue[j];
    63 resultNumValue[i + j] += resultNumValue[i + j +1] /10;
    64 resultNumValue[i + j + 1] = resultNumValue[i + j + 1] % 10;
    65 }
    66 }
    67
    68 //将整形数组转化成字符数组
    69 char[] temp = new char[resultNumLength];
    70 for (int i = 0; i < resultNumLength; i++)
    71 {
    72 temp[i] = (char)(resultNumValue[i] + 48);
    73 }
    74 //将字符数组转化为字符串
    75 string resultStr = new string(temp);
    76 return resultStr;
    77 }
    78 catch (Exception ex)
    79 {
    80 return string.Empty;
    81 }
    82 }
    83 }
    84 }

      。。。。。。

  • 相关阅读:
    ubuntu14.04安装chromium以及flash插件
    linux fuser的使用
    对max_allowed_packet这个参数的误解
    Linux hostname主机名配置文件与文件 /etc/hosts解析(copy来的,原作者看到了别打我)
    三个参数,对mysql存储限制的影响
    唉,没来这里好久了,也意味着我这一年多来没干什么正事儿,是回归的时候了!(简单谈谈爬虫的解析器)
    STM32 宏定义翻转端口
    ascii码表
    平均值算法
    stm8 16M晶振下精确软件延时
  • 原文地址:https://www.cnblogs.com/mingmingruyuedlut/p/2136687.html
Copyright © 2011-2022 走看看