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
  • 相关阅读:
    tensorflow 学习
    join-semi and join-anti
    深入拆解Tomcat_Jetty 笔记
    Set化
    DDD实战-笔记
    高并发系统设计-笔记
    技术管理
    性能调优-笔记
    程序员是如何思考的-笔记
    LeetCode
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11167770.html
Copyright © 2011-2022 走看看