大数相乘-高精度乘法

一、算法简要描述

给定两个数,相乘如何得到高精度的结果,给定的两个数,不确定是不是浮点数,即可能一个数带多位小数,另一个带小数,或者两个数都带多位小数,或都不带小数,针对这些情况,程序应该都要考虑,所谓的高精度其实就是看两个数的小数位有多少,那么其结果的小数位数应该为两数小数位数之和。

二、算法思路

针对上述描述,其实大部分思路首先想到的应该是用字符串来表示这两个数,带小数点和不带小数点最终都可转换成类似于两个大整数相乘的情况,在最后考虑把小数点放到结果的合适位置即可

三、算法代码

/*
two float multipy, design a high-precision algorithm
*/

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

/*
* 函数:实现两数相乘,并在合适位置插入小数点,posDot为两数小数位数之和
*/
void big_multi(const char *str1,const char *str2,int posDot)
{
    int i,j;
    int len1=strlen(str1);
    int len2=strlen(str2);
    int rlen=len1+len2;
    int *pResult = new int[rlen];  //分配一个数组存储计算结果,大小为两数的位数之和
    memset(pResult,0,rlen*sizeof(int));
    //逐位相乘并放在相应位置,pResult[0]存放最终的进位,所以计算时是pResult[i+j+1]
    for(i=0;i<len1;++i)
    {
        for(j=0;j<len2;++j)
            pResult[i+j+1]+=(str1[i]-‘0‘)*(str2[j]-‘0‘);
    }
    //判断逐位相乘的结果是否大于10,如果大于10要从后向前进位
    for(i=rlen-1;i>0;--i)
    {
        int t=pResult[i];
        if(t>9)
        {
            pResult[i-1] += t/10;
            pResult[i]=t%10;
        }
    }
    //判断结果开头是否是以0开头的,如果是要去掉
    i=0;
    while(pResult[i]==0)
        i++;
    //小数点位置应为从后往前posDot位
    j=i;
    while(j<rlen)
    {

        if(j==rlen-posDot)
            cout<<".";
        cout<<pResult[j];
        j++;
    }
    cout<<endl;

}
int main()
{

    string s1,s2;
    int pos1,pos2,posDot;
    while(cin>>s1>>s2)
    {
        if(s1=="quit")
            break;

        pos1=s1.find(".");
        pos2=s2.find(".");
        //计算两数最终相乘结果的小数位数,有3种情况如下
        //两数都有小数点的情况
        if(pos1!=string::npos && pos2!=string::npos)
            posDot = s1.length()+s2.length()-pos1-pos2-2;
        //其中一个有小数点的情况
        else if (pos2!=string::npos)
            posDot = s2.length()-pos2-1;
        //其中一个有小数点的情况
        else if (pos1!=string::npos)
            posDot = s1.length()-pos1-1;
        //在相乘之前,先把两数中的小数点去掉,用stl的remove_if函数
        string::iterator newEnd1=remove_if(s1.begin(),s1.end(),bind2nd(equal_to<char>(),‘.‘));
        string::iterator newEnd2=remove_if(s2.begin(),s2.end(),bind2nd(equal_to<char>(),‘.‘));
        //去年小数点后,还要把新字符串结尾和原字符串结尾之间的多余字符删除
        s1.erase(newEnd1,s1.end());
        s2.erase(newEnd2,s2.end());
        const char *str1=s1.c_str();
        const char *str2=s2.c_str();
        //cout<<str1<<" "<<str2<<" "<<posDot<<endl;
        big_multi(str1,str2,posDot);
    }

    return 0;
}
时间: 2024-10-26 02:53:51

大数相乘-高精度乘法的相关文章

大数相乘&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] =

大数相乘

1.算法思路 将大数当做字符串进行处理,也就是将大数用十进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程得到乘法的结果. 乘积是逐位相乘,也就是a[i] * b[j],结果加入到积C的第i+j位,即 最后处理进位即可 例如:A =17 = 1*10 + 7 = (7,1)最后是十进制的幂表示法,幂次是从低位到高位,以下同. B=25 = 2*10 + 5 = (5, 2); C = A * B = (7 * 5, 1 * 5 + 2 * 7, 1 * 2) = (35, 19, 2)

大数加法、乘法

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

[转]高精度乘法计算

转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(Integer Part,IP)与小数部分(Decimal Part,DP)的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数(IxI).整数x小数(IxD)和小数x小数(DxD).用表达式表示, 则FP1*FP2=IP1*IP2+(IP1*DP2+IP2*DP1)+DP1*DP2 (1)对于I

ACM大赛题 【C++大数相乘】

题     目: 大数相乘,我们常常会遇见几百位长的数字之间相乘的编程题,例如在算法中,ACM大赛题中,下面就是大数相乘的详细过程. 思      路: 模拟相乘法 举例说明: 123*789=97047 原理展示: 计算机计算: . C++源代码: 结果展示:

【PKU1001】Exponentiation(高精度乘法)

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 145642   Accepted: 35529 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the n

POJ 1001 Exponentiation 无限大数的指数乘法 题解

POJ做的非常好,本题就是要求一个无限位大的指数乘法结果. 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了. 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的. 本题对程序健壮性的考查到达了变态级别了. 某人贴出的測试用例数据地址: http://poj.org/showmessage?message_id=76017 有了这些用例,几下调试就过了. 我关键漏了的用例: 000.10  1 000000  1 000.00  1 .00000  0 0000

洛谷 P1303 A*B Problem 高精度乘法

P1303 A*B Problem 时空限制1s / 128MB 题目描述 求两数的积. 输入输出格式 输入格式: 两行,两个数. 输出格式: 积 输入输出样例 输入样例#1: 1 2 输出样例#1: 2 说明 每个数字不超过10^2000,需用高精 ------------------------------------------------------------------------------------------------ 既然有了高精度加减法,那就有高精度乘法 跟我们平时计算

Stanford Algorithms(一): 大数相乘(c++版)

Stanford Algorithms(一): 大数相乘(c++版) 刚不就在中国大学Mooc上参加了陈越老师的数据结构的课程,收获很大.觉得趁热打铁,也把算法的部分也给一块学了吧,就在Coursera上注册了一个斯坦福大学的算法课,课程的量很重,估计要学一个学期吧,慢慢的学,稳扎稳打. 课程里推荐了很多书,我找了一本, 书名就叫Algorithms,作者是S.Dasgupta教授,简单翻看了一下,觉得写的挺不错,就姑且把这本书当做教材了. 还是那句话,贵精不贵多,一门学深入了,收获就会很大,总