大数运算(2) —— 乘法篇

前言

  开始编写大数乘法(multiplication)时,网上阅读了几篇文章,其中包含多种实现方法。本文参考其中一种实现方法,然后进行改写。再者,下述代码的结构体遵循前篇定义。

原理

  本文所采用的大数乘法方法任是模拟人工计算,大致思路如下:

    1.对两个操作数的每位分别进行相乘,再把得到的积的个位数累加到相应位置(下述给出该位置定义)。

    2.判断得到的积是否大于等于10,若是则进位。

    3.判断相应位置的数是否大于等于10,若是则进位。

  上述相应位置的定义为,设操作数1当前位数为i,操作数2当前位数为j,则相应位置为i+j。由此得出,进位位数为i+j+1。

实现

  下面给出大数乘法函数的定义:

 1 void multiply(OPERAND* operand1 , OPERAND* operand2,OPERAND* operand3)
 2 {
 3     int i = 0 , j = 0;
 4     for(i = 0;i < operand1->digit;i++)    // i层循环
 5     {
 6         for(j = 0;j < operand2->digit;j++)    // j层循环
 7         {
 8             int difference = operand1->data[i] * operand2->data[j];    // 计算 操作数1的i位数
 9                                                                     // 与 操作数2的j位数 之积
10             operand3->data[i+j] += difference % 10;    // 累加i+j位的数
11
12             operand3->digit = i+j + 1;    // 更新该数的位数
13
14             if(difference >= 10)    // 若积大于10 , 累加i+j+1位的数
15             {
16                 operand3->data[i+j+1] += difference / 10;
17                 operand3->digit = i+j+1 + 1;    // 更新该数的位数
18             }
19
20             if(operand3->data[i+j] >= 10)    // 若i+j位的数大于10 , 进行进位操作
21             {
22                 operand3->data[i+j+1] += operand3->data[i+j] / 10;
23                 operand3->data[i+j] %= 10;    // i+j位数 替换 为其个位数
24                 operand3->digit = i+j+1 + 1;    // 更新该数的位数
25             }
26         }
27     }
28 }

  注意更新位数的问题。

时间: 2024-10-19 02:45:08

大数运算(2) —— 乘法篇的相关文章

大数运算之字符串模拟

相信大家被特别大的两个数据做运算折磨过.当两个操作数或者运算结果超过类型的表示范围后会有意想不到的错误,这时候我们的电脑还不如我们高中用过的科学计算器,这是作为一个程序员所不能忍受的.所以我们得找到其他的方式来计算.这就是我们今天要讨论的字符串模拟大数运算. 我们的运算一般使用int类型来算的,那么首先我们先复习一下各种int类型的数据表示范围: unsigned int 0-4294967295    int   -2147483648-2147483647  unsigned long 0-

HDU 4927 大数运算

模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 class BigInt { private: int a[500]; //可以控制大数的位数 i

java 大数运算[转]

用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如123456789987654321这样的整数就不能存放在long类型的变量中,如果这样两个大数相加或相乘,产生的结果会更大.比如,JAVA语言中如果使用long l = 1000000000这样定义没错,但如果加上2000000000变成 1000000000+2000000000测试结果就为-1

大数运算——字符串操作结合“竖式计算“思想的实现

总体原则: 字符串转整形数组,然后按照“竖式计算”的思想,按位(对于数组来说,就是对应位置的元素)进行运算,同时处理进位.退位.最后将整形数组转换为字符串输出. Ps:1.字符串转整形,本文采取逆序存储的方式,即将字符串的低位(大数的高位)放置到整形数组的高位. 2.本文提供的四个四则运算方法,所有的输入值(大数)必须为正整数. 一.加法 加法运算遵循从低位到高位运算的法则.将字符串转换为整形数组后,两数组对应元素相加,结果存储至结果数组的相应元素位置.同时对相加后的元素进行整除和取余运算(整除

大数运算之 Java BigInteger 的基本用法

大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInteger 提供了高精度的基本运算,因此竞赛中常用 Java 解决高精度运算问题. 当然如果比赛支持 python 就当我没说. BigInteger 对象的创建 BigInteger 类在 java.math.BigInteger 包中,首先引用该包. import java.math.BigInt

关于大数运算

在接触计算机这么久以来,我一直被大数运算困扰,确切的说是在一些特定方面非常有受挫感,在计算机中的数据类型对数字支持的数位有限制,例如: long   long  int  a = 0; 这里的a 最多可以表示一个9位的长整型数字,要想存储超过9位的数字,最可行的方法是使用数组来存储每一位的值.所以在遇到大数运算的时候可以借用数组来完成相应的运算操作.

大数加法、乘法

1 #include<iostream> 2 3 #include<stdio.h> 4 5 #include<string.h> 6 7 #define Len 3000//大数的长度 8 9 using namespace std; 10 11 int Input (char n[])//将大数读入的函数 12 13 { 14 15 char s[Len]; 16 17 int i,l; 18 19 20 21 for(i=0; i<Len; i++) n[i

大数运算(python2)

偶然又遇到了一道大数题,据说python大数运算好屌,试了一发,果然方便- 1 a = int( raw_input() ); //注意这里是按行读入的,即每行只读一个数 2 b = int( raw_input() ); 3 print a+b; 4 print a*b; 5 print a/b; 6 print a%b;

大数相乘&mdash;&mdash;模拟乘法的运算规则

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { void add(int a[], int length1, int b[], int length2); char str1[255], str2[255]; int num1[255] = { 0 }, num2[255] = { 0 }; int product[255] = { 0 }, temp[255] =

Big Number------HDOJ杭电1212(大数运算)

Problem Description As we know, Big Number is always troublesome. But it's really important in our ACM. And today, your task is to write a program to calculate A mod B. To make the problem easier, I promise that B will be smaller than 100000. Is it t