C语言,两个超大整型数乘法

  对于整形依次为int, long int, long long int。表示范围如下:

类型 字节数 表示范围
int 4 -2147483648~+2147483647
long int 4 -2147483648~2147483647
long long int 16 -9223372036854775808~+9223372036854775807

  但有的情况使用long long int 也无法表示,这个时候要使用数组的表示形式。整体的计算方法与手工计算顺序一致,数A的每一位与数B相乘再相加(注意数A的每一位要记得乘以10),做加法的时候要处理好进位的关系。
  源代码如下:

#include<iostream>
#include<iomanip>
#include<vector>
#include<string>
#include<fstream>
using namespace std;

void bigNumMul(long int x,long int y)
{
    
    
	int a[64] = {
    
    0};
	int b[64] = {
    
    0};
	int c[64] = {
    
    0};
    long t;
	if(x<y)  // 保证x是大的那一个 
	{
    
    
		t = x;
		x = y;
		y = t; 
	} 
	long m = x;
	int a_num = 0;
    //把x每位数分别存入数组
    for(int i=0; i<64; i++)
	{
    
    
		a[i] = m%10;
		a_num++;
		m = m / 10;
		if(m == 0)
			break;
	}

	long n = y;
	int b_num = 0;
    //把y每位数分别存入数组
	for(int i=0; i<64; i++)
	{
    
    
		b[i] = n%10;
		b_num++;
		n = n/10;
		if(n == 0)
			break;
	}
        
    //中间数的存放位为num+1
	const int _a_num=a_num+1;
	vector<int>mid_val; // 最好使用vector, 静态整形数组还是有长度限制,空间可能会爆 
	for(int i=0;i<_a_num;i++)
	{
    
    
		mid_val.push_back(0);
	}
    
    // 乘法操作 
	for(int i=0; i<b_num; i++)
	{
    
       int backAdd = 0;//backAdd为乘积的进位数
		// 一位乘一行 
		for(int j=0; j<=a_num; j++)
		{
    
    
			int product = a[j]*b[i];//两个位数乘积
			int sum = product + backAdd;
			mid_val[j] = sum%10;
			backAdd=sum/10;
		}
		// 一行加一行 
        backAdd = 0;//一行积的一位与另一行积的一位相加的进位数
		for(int k=i; k<=i+a_num; k++) // 从i开始是为了符合,乘法每高位依次向左移 
		{
    
    
			int sum = c[k] + mid_val[k-i] + backAdd;
			c[k] = sum % 10;
			backAdd = sum / 10;
		}
	}

	// 放入是是倒叙放入,查找的时候也需要倒着 
	int startBit=0;
	for(int i=63;i>=0;i--)
	{
    
    
		if(c[i]!=0)
		{
    
    
			startBit=i;
			break;
		}
	}
	for(int i=startBit;i>=0;i--)
	{
    
    
		cout<<c[i];
	}
}

int main(void)
{
    
    
	bigNumMul(2147483647,2147483647);
	return 0;
} 

参考博客:

https://blog.csdn.net/tsinfeng/article/details/5939395

https://blog.csdn.net/xcrazyu/article/details/87879103

猜你喜欢

转载自blog.csdn.net/gls_nuaa/article/details/114682250