整数シェーピングの場合、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;
}
参照ブログ: