对于整形依次为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;
}
参考博客: