算法提高 高精度乘法

 
时间限制:1.0s   内存限制:256.0MB
提交此题    
问题描述
  在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263。要想计算更加规模的数,就要用软件来扩展了,比如用数组或字符串来模拟更多规模的数及共运算。
  现在输入两个整数,请输出它们的乘积。
输入格式
  两行,每行一个正整数,每个整数不超过10000位
输出格式
  一行,两个整数的乘积。
样例输入
99
101
样例输出
9999
数据规模和约定
  每个整数不超过10000位
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	string a;
	string b;
	int flag=2;
	int max;
	int len;
	int u;
	int c[20002]={0};
	int  e[10001];
	int  d[10001];
    cin>>a;
	cin>>b;
for(int i=0,l=a.length()-1;i<a.length();)
	e[l--]=a[i++]-'0';
	for(int j=0,m=b.length() -1;j<b.length();)
	d[m--]=b[j++]-'0';
	if(a.length()>b.length())//a的长度长一些 
	{
		len=b.length();
		flag=1;
		max=a.length();	
	}
	else//b 的长度长一些 
	{
	len=a.length();
	flag=0;
	max=b.length();
	}
	
	if(flag==0)
	{
		for(int i=0;i<len;i++)//短的控制外层循环,每一个和内层循环的相乘 
		{
		    int	k=i;
 			for(int j=0;j<max;j++)
			{
				int s=c[k]+e[i]*d[j];
				c[k]=s%10;
				c[k+1]=s/10+c[k+1];
				k++;
			 } 
		 } 
	}
		else 
		{
			for(int i=0;i<len;i++)//短的控制外层循环,每一个和内层循环的相乘 
		{
		    int	k=i;
			for(int j=0;j<max;j++)
			{
				int s=c[k]+d[i]*e[j];
				c[k]=s%10;
				c[k+1]=s/10+c[k+1];
				k++;
			 } 
		 } 
		}
		
		for(int x=20000;x>=0;x--)
	   {
		if(c[x]!=0)
		{
		u=x;
		break;	
		}
		
	   }
	for(int o=u;o>=0;o--)
	{
		cout<<c[o];
	   
     }
	return 0;
}

  

这道题就是大数加法和阶乘结合在一起,
每一位依次相乘
最后加在一次
每一次都对结果取余数是当前的位数结果
/10是产生的进位

  

原文地址:https://www.cnblogs.com/jweie/p/8385534.html