C言語、2つの大きな整数の乗算

  整数シェーピングの場合、int、long int、long longintです。範囲は次のとおりです。

の種類 バイト数 表現範囲
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