zoukankan      html  css  js  c++  java
  • 【高精度乘法】

    本章基于高精度加法
    这一章就不介绍读入和进位操作了,有需要的去上面那篇博客看。
    很明显乘法不能简单的写c[i]=a[i]*b[i];了。
    那么怎么写?
    根据乘法的错位计算原理,我们可以很轻松地写出:
    c[i+j]=a[i]*b[j];
    那么就很轻松的改一改加法的代码 写出来了。
    然后说输出问题。
    一个m位数*一个n位数,结果会是几位数?
    很明显,要么是m+n位,要么是m+n-1位。
    那么输出的时候将c数组前面是0的位数给排除,输出即可。
    这一段的代码实现:

    int q=aa.size()+bb.size();
    while(!c[q])q--;
    for(int i=q;i>=0;i--)
    {
    	cout<<c[i];
    } 
    cout<<endl;
    

    代码如下:(附加一个高精加法自定义函数)

    #include<bits/stdc++.h>
    using namespace std;
    string aa,bb;
    int a[10010],b[10010],c[20020];
    void add()
    {
    	memset(c,0,sizeof(c));
    	for(int i=0;i<max(aa.size(),bb.size());i++)
    	{
    		c[i]=a[i]+b[i];
    	}
    	for(int i=1;i<max(aa.size(),bb.size())+1;i++)
    	{
    		c[i]+=c[i-1]/10;
    		c[i-1]%=10;
    	}
    	if(c[max(aa.size(),bb.size())])cout<<c[max(aa.size(),bb.size())];
    	for(int i=max(aa.size(),bb.size())-1;i>=0;i--)
    	{
    		cout<<c[i];
    	} 
    	cout<<endl;
    	return;
    }
    void times()
    {
    	memset(c,0,sizeof(c));
    	for(int i=0;i<aa.size();i++)
    	{
    		for(int j=0;j<bb.size();j++)
    		{
    			c[i+j]+=a[i]*b[j];
    		}
    	}
    	for(int i=0;i<aa.size()+bb.size()+1;i++)
    	{
    		c[i]+=c[i-1]/10;
    		c[i-1]%=10;
    	}
    	int q=aa.size()+bb.size();
    	while(!c[q])q--;
    	for(int i=q;i>=0;i--)
    	{
    		cout<<c[i];
    	} 
    	cout<<endl;
    }
    int main()
    {
    	char mark;
    	cin>>aa>>bb;
    	for(int i=0;i<=aa.size()-1;i++)
    	{
    		a[i]=aa[aa.size()-i-1]-'0';
    	}
    	for(int i=0;i<=bb.size()-1;i++)
    	{
    		b[i]=bb[bb.size()-i-1]-'0';
    	}
    	add();
    	times();
    	return 0;
    }
    

    ov.

    个人博客地址: www.moyujiang.com 或 moyujiang.top
  • 相关阅读:
    如何学习一门新技术
    linux atoi
    linux switch 跳转到 ”跳转至 case 标号“ 的错误
    from unittest import TestCase
    ensure that both new and old access_token values are available within five minutes, so that third-party services are smoothly transitioned.
    .BigInteger
    408
    Convert a string into an ArrayBuffer
    Optimal asymmetric encryption padding 最优非对称加密填充(OAEP)
    https://tools.ietf.org/html/rfc8017
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11167770.html
Copyright © 2011-2022 走看看