高精度乘法
2026-07-18 15:53:40
发布于:浙江
9阅读
0回复
0点赞
#include<iostream>
using namespace std;
long long tmp = 0;
struct bignum{
int val[11005] = {};//值
int len = 0;//长度
bignum(string a){
for(int i = a.size()-1;i>=0;i--){
val[a.size()-1-i]=a[i]-'0';//字符转整数
}
len = a.size();
}
bignum(){
}
bignum operator+(const bignum& b){
bignum res;
int flag = 0;//用于保留进位信息
for(int i = 0;i<max(len,b.len);i++){
res.val[i] = val[i]+b.val[i]+flag;
flag = res.val[i]/10;
res.val[i]%=10;
}
res.len = max(len,b.len);
if(flag == 1){//判断最高位进位
res.val[res.len] = 1;
res.len++;
}
return res;
}
bignum operator-(const bignum& b){
bignum res;
int flag = 0;//借位信息
for(int i = 0;i<max(len,b.len);i++){
res.val[i] = val[i]-b.val[i]+flag;
if(res.val[i]<0){
res.val[i]+=10;
flag = -1;
}
else{
flag = 0;
}
}
for(int i = 11000;i>=0;i--){
if(res.val[i]!=0){//找到最高位
res.len = i+1;
break;
}
}
return res;
}
bignum operator*(const bignum& b){
bignum res;
int len1 = len,len2 = b.len;//两个高精度数的长度
for(int i = 0;i<len2;i++){
for(int j = 0;j<len1;j++){
res.val[i+j]+=val[j]*b.val[i];
}
}
//处理进位
int flag = 0;
for(int i = 0;i<len1+len2;i++){
res.val[i]+=flag;//加上进位
flag=res.val[i]/10;
res.val[i]%=10;
}
//确定长度
for(int i = len1+len2;i>=0;i--){
if(res.val[i]!=0){
res.len=i+1;
break;//找到了之后结束
}
}
return res;
}
bignum operator*(const int b){
bignum res;
if(b==0)return res;
int flag = 0;//进位信息
for(int i = 0;i<len;i++){
res.val[i]=val[i]*b;
res.val[i]+=flag;
flag = res.val[i]/10;
res.val[i]%=10;
}
res.len = len;
while(flag){//有进位的情况
res.val[res.len] = flag%10;
flag/=10;
res.len++;
}
return res;
}
bignum operator/(const int b){
bignum res;
bool flag = 0;
for(int i = len-1;i>=0;i--){
tmp*=10;
tmp+=val[i];
res.val[i] = tmp/b;
if(flag == 0&&res.val[i]){
res.len = i+1;
flag = 1;
}
tmp%=b;
}
return res;
}
void print(){//输出这个数
if(len == 0)cout << 0;
for(int i = len-1;i>=0;i--){
cout << val[i];
}
cout<<'\n';
}
};
int main(){
int t;
cin >> t;
while(t--){
string a;
cin >> a;
bignum n(a);
bignum res = n*(n+bignum("1"))/2;
res.print();
}
return 0;
}
全部评论 1
2026-07-18 来自 浙江
0

有帮助,赞一个