HappyDavid @ 2022-08-11 11:58:54
代码
#include <bits/stdc++.h>
using namespace std;
//高精度大数
struct hugeint{
long long num[10100]={0};//倒序存储具体的数字
int len=0;//数字的长度
string s="";
};
//将字符串转成数字 "1234" 4321
hugeint strtoint(string s){
hugeint ans;
for(int i=s.size()-1;i>=0;i--){
ans.num[++ans.len]=s[i]-'0';
}
return ans;
}
//打印高精度大数
void printint(hugeint n){
cout<<n.s;
for(int i=n.len;i>=1;i--){
cout<<n.num[i];
}
cout<<endl;
}
//比较两个数字大小,如果a>b返回1,如果a<b返回-1,如果a=b返回0
int cmp2(hugeint a,hugeint b){
//如果数字长度不一样,长的数字比较大
if(a.len>b.len){
return 1;
}
else if(b.len>a.len){
return -1;
}
else{
//如果数字长度相同,从高位到低位逐位比较
for(int i=1;i<=a.len;i++){
if(a.num[i]>b.num[i]){
return 1;
}
else if(b.num[i]>a.num[i]){
return -1;
}
}
return 0;
}
}
//处理前导0
hugeint prelead0(hugeint n){
while(n.num[n.len]==0 && n.len>1){
n.len--;
}
return n;
}
//高精度+高精度
hugeint add(hugeint a,hugeint b){
hugeint ans;
ans.len=max(a.len,b.len);
//从低位往高位进行运算
for(int i=1;i<=ans.len;i++){
ans.num[i]=a.num[i]+b.num[i];//对应位进行加法运算
ans.num[i+1]=ans.num[i]/10;//更新进位
ans.num[i]%=10;//将运算结果的个位保存到ans中
}
//处理进位溢出
if(ans.num[ans.len+1]>0){
ans.len++;
}
return ans;
}
//高精度-高精度
hugeint sub(hugeint a,hugeint b){
hugeint ans;
//如果a<b,交换它们,标记运算结果
if(cmp2(a,b)==-1){
swap(a,b);
ans.s="-";
}
ans.len=a.len;
//从低位到高位进行运算
for(int i=1;i<=ans.len;i++){
ans.num[i]+=a.num[i]-b.num[i];//对应位进行减法运算
//处理借位
if(ans.num[i]<0){
ans.num[i+1]=-1;//更新借位
ans.num[i]+=10;
}
}
ans=prelead0(ans);//处理前导0
return ans;
}
//高精度*高精度
hugeint mul(hugeint a,hugeint b){
hugeint ans;
ans.len=a.len+b.len-1;
//从低位往高位进行运算
for(int i=1;i<=a.len;i++){
for(int j=1;j<=b.len;j++){
ans.num[i+j-1]=a.num[i]*b.num[j];//对应位进行乘法运算
ans.num[i+j]+=ans.num[i+j-1]/10;//更新进位
ans.num[i+j-1]%=10;//将运算结果的个位保留到ans中
}
}
//处理进位溢出
if(ans.num[ans.len+1]>0){
ans.len++;
}
ans=prelead0(ans);//处理前导0
return ans;
}
//高精度/低精度
hugeint div(hugeint a,long long b){
hugeint ans;
ans.len=a.len;
//从高位到低位进行运算
for(int i=a.len;i>=1;i--){
ans.num[i]=ans.num[i]/b;//对应位进行除法运算
a.num[i-1]=a.num[i]%b*10;//处理余数
}
ans=prelead0(ans);//处理前导0
return ans;
}
int plusMAIN(){
string a,b;
cin>>a>>b;
hugeint n1=strtoint(a);
hugeint n2=strtoint(b);
printint(add(n1,n2));
return 0;
}
int minusMAIN(){
string a,b;
cin>>a>>b;
hugeint n1=strtoint(a);
hugeint n2=strtoint(b);
printint(sub(n1,n2));
return 0;
}
int timesMAIN(){
string a,b;
cin>>a>>b;
hugeint n1=strtoint(a);
hugeint n2=strtoint(b);
printint(mul(n1,n2));
return 0;
}
int dividedMAIN(){
string a;
long long b;
cin>>a>>b;
hugeint n1=strtoint(a);
printint(div(n1,b));
return 0;
}
/*
*/
int main()
{
timesMAIN();
return 0;
}
提交网址https://www.luogu.com.cn/record/83326197
by HappyDavid @ 2022-08-11 12:00:47
加法贴https://www.luogu.com.cn/discuss/475494 乘法贴https://www.luogu.com.cn/discuss/475550
by UnyieldingTrilobite @ 2022-08-11 12:06:01
#include <bits/stdc++.h>
using namespace std;
//高精度大数
struct hugeint{
long long num[10100]={0};//倒序存储具体的数字
int len=0;//数字的长度
string s="";
};
//将字符串转成数字 "1234" 4321
hugeint strtoint(string s){
hugeint ans;
for(int i=s.size()-1;i>=0;i--){
ans.num[++ans.len]=s[i]-'0';
}
return ans;
}
//打印高精度大数
void printint(hugeint n){
cout<<n.s;
for(int i=n.len;i>=1;i--){
cout<<n.num[i];
}
cout<<endl;
}
//比较两个数字大小,如果a>b返回1,如果a<b返回-1,如果a=b返回0
int cmp2(hugeint a,hugeint b){
//如果数字长度不一样,长的数字比较大
if(a.len>b.len){
return 1;
}
else if(b.len>a.len){
return -1;
}
else{
//如果数字长度相同,从高位到低位逐位比较
for(int i=1;i<=a.len;i++){
if(a.num[i]>b.num[i]){
return 1;
}
else if(b.num[i]>a.num[i]){
return -1;
}
}
return 0;
}
}
//处理前导0
hugeint prelead0(hugeint n){
while(n.num[n.len]==0 && n.len>1){
n.len--;
}
return n;
}
//高精度+高精度
hugeint add(hugeint a,hugeint b){
hugeint ans;
ans.len=max(a.len,b.len);
//从低位往高位进行运算
for(int i=1;i<=ans.len;i++){
ans.num[i]=a.num[i]+b.num[i];//对应位进行加法运算
ans.num[i+1]=ans.num[i]/10;//更新进位
ans.num[i]%=10;//将运算结果的个位保存到ans中
}
//处理进位溢出
if(ans.num[ans.len+1]>0){
ans.len++;
}
return ans;
}
//高精度-高精度
hugeint sub(hugeint a,hugeint b){
hugeint ans;
//如果a<b,交换它们,标记运算结果
if(cmp2(a,b)==-1){
swap(a,b);
ans.s="-";
}
ans.len=a.len;
//从低位到高位进行运算
for(int i=1;i<=ans.len;i++){
ans.num[i]+=a.num[i]-b.num[i];//对应位进行减法运算
//处理借位
if(ans.num[i]<0){
ans.num[i+1]=-1;//更新借位
ans.num[i]+=10;
}
}
ans=prelead0(ans);//处理前导0
return ans;
}
//高精度*高精度
hugeint mul(hugeint a,hugeint b){
hugeint ans;
ans.len=a.len+b.len-1;
//从低位往高位进行运算
for(int i=1;i<=a.len;i++){
for(int j=1;j<=b.len;j++){
ans.num[i+j-1]+=a.num[i]*b.num[j];//对应位进行乘法运算
ans.num[i+j]+=ans.num[i+j-1]/10;//更新进位
ans.num[i+j-1]%=10;//将运算结果的个位保留到ans中
}
}
//处理进位溢出
if(ans.num[ans.len+1]>0){
ans.len++;
}
ans=prelead0(ans);//处理前导0
return ans;
}
//高精度/低精度
hugeint div(hugeint a,long long b){
hugeint ans;
ans.len=a.len;
//从高位到低位进行运算
for(int i=a.len;i>=1;i--){
ans.num[i]=ans.num[i]/b;//对应位进行除法运算
a.num[i-1]=a.num[i]%b*10;//处理余数
}
ans=prelead0(ans);//处理前导0
return ans;
}
int plusMAIN(){
string a,b;
cin>>a>>b;
hugeint n1=strtoint(a);
hugeint n2=strtoint(b);
printint(add(n1,n2));
return 0;
}
int minusMAIN(){
string a,b;
cin>>a>>b;
hugeint n1=strtoint(a);
hugeint n2=strtoint(b);
printint(sub(n1,n2));
return 0;
}
int timesMAIN(){
string a,b;
cin>>a>>b;
hugeint n1=strtoint(a);
hugeint n2=strtoint(b);
printint(mul(n1,n2));
return 0;
}
int dividedMAIN(){
string a;
long long b;
cin>>a>>b;
hugeint n1=strtoint(a);
printint(div(n1,b));
return 0;
}
/*
*/
int main()
{
timesMAIN();
return 0;
}
老规矩,自己找不同。
by Hoks @ 2022-08-21 09:55:38
为什么要别人帮你找