当前位置:网站首页>Addition, Subtraction, Multiplication of Large Integers, Multiplication and Division of Large Integers and Ordinary Integers
Addition, Subtraction, Multiplication of Large Integers, Multiplication and Division of Large Integers and Ordinary Integers
2022-08-01 20:00:00 【Madness is free】
2)两个大整数相乘:
You can simulate it by listing two small integers by yourself,to understand the code:
/**
2)两个大整数相乘
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct bignum
{
int d[1000];
int len;
bignum()
{
memset(d,0,1000);
len=0;
}
};
bignum str_big(string str);
bignum divide(bignum& n,int q,int&r);
void print(bignum n);
bignum big_mult(bignum n,bignum m);
int main()
{
string str1,str2;
cin >> str1 >> str2;
bignum num1=str_big(str1);
bignum num2=str_big(str2);
print(big_mult(num1,num2));
return 0;
}
bignum str_big(string str)
{
bignum num;
int ans=str.size();
for(int i=ans-1;i>=0;--i)
{
num.d[num.len++]=str[i]-'0';
}
return num;
}
void print(bignum n)
{
for(int i=n.len-1;i>=0;--i)
printf("%d",n.d[i]);
}
bignum big_mult(bignum n,bignum m)
{
bignum num;
num.len=m.len+n.len;
printf("%d %d %d\n",n.len,m.len,num.len); //Debug a use
int r=0;
for(int i=0;i<m.len;++i)
{
for(int j=0;j<n.len;++j)
{
r=r+m.d[i]*n.d[j]+num.d[i+j]; //记得将num.d[i+j]的值加上;
num.d[i+j]=r%10;
r/=10;
if(j==n.len-1&&r!=0) //If the second digit has been counted,You have to save the remainder togethernum中
{
num.d[i+j+1]=r%10;
r=0;
}
}
}
while(num.len>1&&num.d[num.len-1]==0)
--num.len;
return num;
}
2)大整数相加,相减,Multiplication of large integers by ordinary integers,相除
/**
2)大整数相加,相减,Multiplication of large integers by ordinary integers,相除
*/
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct bign
{
int d[1000];
int len;
bign()
{
memset(d,0,sizeof(d));
len=0;
}
};
bign div(bign a,int b,int &r);
bign change(char str[]);
bign add(bign a,bign b);
bign sub(bign a,bign b);
bign mul(bign a,int b);
void print(bign a);
int main()
{
char str1[1000],str2[1000];
int b,r=0;
printf("Enter two large integers and one positive integer:\n");
scanf("%s%s%d",str1,str2,&b);
int mn;
if(strlen(str1)>strlen(str2))
mn=1;
else if(strlen(str1)==strlen(str2))
mn=strcmp(str1,str2);
else mn=-1;
bign a=change(str1);
bign d=change(str2);
bign jia=add(a,d);
bign jian;
bign cheng=mul(a,b);
bign chu=div(a,b,r);
printf("加法:\n");
print(jia);
printf("减法:\n");
if(mn>=0)
{
jian=sub(a,d);
print(jian);
}
else
{
jian=sub(d,a);
printf("-");
print(jian);
}
printf("乘法:\n");
print(cheng);
printf("除法:\n");
print(chu);
printf("余数:\n%d\n",r);
cout << "Hello world!" << endl;
return 0;
}
bign change(char str[])
{
bign b;
b.len=strlen(str);
for(int i=0;i<b.len;i++)
{
b.d[i]=str[b.len-i-1]-'0';
}
return b;
}
bign div(bign a,int b,int &r)
{
bign c;
c.len=a.len;
for(int i=a.len-1;i>=0;i--)
{
r=r*10+a.d[i];
c.d[i]=r/b;
r%=b;
}
while(c.len-1>=1&&c.d[c.len-1]==0)
c.len--;
return c;
}
bign add(bign a,bign b)
{
bign c;
int ans=0;
for(int i=0;i<a.len||i<b.len;i++)
{
ans=ans+a.d[i]+b.d[i];
c.d[c.len++]=ans%10;
ans/=10;
}
if(ans!=0)
c.d[c.len++]=ans;
return c;
}
bign sub(bign a,bign b)
{
bign c;
for(int i=0;i<a.len||i<b.len;i++)
{
if(a.d[i]<b.d[i])
{
a.d[i+1]--;
a.d[i]+=10;
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.len-1>=1&&c.d[c.len-1]==0)
c.len--;
return c;
}
bign mul(bign a,int b)
{
bign c;
int ans=0;
for(int i=0;i<a.len;i++)
{
ans=ans+a.d[i]*b;
c.d[c.len++]=ans%10;
ans/=10;
}
while(ans!=0)
{
c.d[c.len++]=ans%10;
ans/=10;
}
return c;
}
void print(bign a)
{
for(int i=a.len-1;i>=0;i--)
printf("%d",a.d[i]);
printf("\n");
}Each of them is given a topic below:当然,The above function is no longer used,The above function is true《算法笔记》上学的,Below is the report Acwing of courses;思想都是一样的:
791. 高精度加法
给定两个正整数(不含前导 0
),计算它们的和.
输入格式
共两行,每行包含一个整数.
输出格式
共一行,包含所求的和.
数据范围
1≤整数长度≤100000
输入样例:
12
23
输出样例:
35
#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B)
{
vector<int> C;
int r=0;
for(size_t i=0;i<A.size()||i<B.size();++i)
{
if(i<A.size()) r+=A[i];
if(i<B.size()) r+=B[i];
C.push_back(r%10);
r/=10;
}
if(r)
C.push_back(r);
return C;
}
int main()
{
string a,b;
cin >> a >> b;
vector<int> A,B;
for(int i=a.size()-1;i>=0;--i)
A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;--i)
B.push_back(b[i]-'0');
vector<int> C=add(A,B);
for(int i=C.size()-1;i>=0;--i)
printf("%d",C[i]);
return 0;
}792. 高精度减法
给定两个正整数(不含前导 0
),计算它们的差,计算结果可能为负数.
输入格式
共两行,每行包含一个整数.
输出格式
共一行,包含所求的差.
数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool Cmp(string &a,string &b)
{
if(a.size()!=b.size())
return a.size() > b.size();
else
for(int i=0;i<a.size();++i)
if(a[i]!=b[i])
return a[i] > b[i];
return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)
{
vector<int> C;
int r=0;
for(int i=0;i<A.size();++i)
{
r+=A[i];
if(i<B.size()) r-=B[i];
C.push_back((r+10)%10);
if(r<0)
r=-1;
else
r=0;
}
while(C.size()>1&&C.back()==0)
C.pop_back();
return C;
}
int main()
{
string a,b;
cin >> a >> b;
vector<int> A,B;
for(int i=a.size()-1;i>=0;--i)
A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;--i)
B.push_back(b[i]-'0');
vector<int> C;
if(Cmp(a,b))
C=sub(A,B);
else
{
C=sub(B,A);
printf("-");
}
for(int i=C.size()-1;i>=0;--i)
printf("%d",C[i]);
return 0;
}793. 高精度乘法
给定两个非负整数(不含前导 0
) A 和 B,请你计算 A×B
的值.
输入格式
共两行,第一行包含整数 A
,第二行包含整数 B
.
输出格式
共一行,包含 A×B
的值.
数据范围
1≤A的长度≤100000
,
0≤B≤10000
输入样例:
2
3
输出样例:
6
#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<int> mul(vector<int> &A,int b)
{
vector<int> C;
int r=0;
for(int i=0;i<A.size();++i)
{
r+=A[i]*b;
C.push_back(r%10);
r/=10;
}
while(r)
{
C.push_back(r%10);
r/=10;
}
while(C.size()>1&&C.back()==0)
C.pop_back();
return C;
}
int main()
{
string a;
int b;
cin >> a >> b;
vector<int> A;
for(int i=a.size()-1;i>=0;--i)
A.push_back(a[i]-'0');
vector<int> C=mul(A,b);
for(int i=C.size()-1;i>=0;--i)
printf("%d",C[i]);
return 0;
}794. 高精度除法
给定两个非负整数(不含前导 0
) A,B,请你计算 A/B
的商和余数.
输入格式
共两行,第一行包含整数 A
,第二行包含整数 B
.
输出格式
共两行,第一行输出所求的商,第二行输出所求余数.
数据范围
1≤A的长度≤100000
,
1≤B≤10000,
B 一定不为 0
输入样例:
7
2
输出样例:
3
1
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
vector<int> div(vector<int> &A,int b,int &r)
{
vector<int> C;
for(int i=A.size()-1;i>=0;--i)
{
r=r*10+A[i];
C.push_back(r/b);
r%=b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0)
C.pop_back();
return C;
}
int main()
{
string a;
int b;
cin >> a >> b;
vector<int> A;
for(int i=a.size()-1;i>=0;--i)
A.push_back(a[i]-'0');
int r=0;
vector<int> C=div(A,b,r);
for(int i=C.size()-1;i>=0;--i)
printf("%d",C[i]);
printf("\n%d\n",r);
return 0;
}边栏推荐
猜你喜欢

PHP 安全最佳实践

安全作业7.25

【torch】张量乘法:matmul,einsum

【kali-信息收集】(1.3)探测网络范围:DMitry(域名查询工具)、Scapy(跟踪路由工具)

Debug一个ECC的ODP数据源

From ordinary advanced to excellent test/development programmer, all the way through

即时通讯开发移动端弱网络优化方法总结

【kali-信息收集】(1.2)SNMP枚举:Snmpwalk、Snmpcheck;SMTP枚举:smtp-user-enum

Creo5.0草绘如何绘制正六边形

XSS range intermediate bypass
随机推荐
The solution to the vtk volume rendering code error (the code can run in vtk7, 8, 9), and the VTK dataset website
18、分布式配置中心nacos
【节能学院】推进农业水价综合改革的意见解读
有序双向链表的实现。
{ValueError}Number of classes, 1, does not match size of target_names, 2. Tr
Redis 做签到统计
不同的操作加不同的锁详解
【kali-信息收集】(1.2)SNMP枚举:Snmpwalk、Snmpcheck;SMTP枚举:smtp-user-enum
给定中序遍历和另外一种遍历方法确定一棵二叉树
第55章 业务逻辑之订单、支付实体定义
工作5年,测试用例都设计不好?来看看大神的用例设计总结
latex论文神器--服务器部署overleaf
ssh & scp
第59章 ApplicationPart内置依赖注入中间件
如何看待腾讯云数据库负责人林晓斌借了一个亿炒股?
八百客、销售易、纷享销客各行其道
密码学的基础:X.690和对应的BER CER DER编码
第58章 结构、纪录与类
数值矩阵的图形表示
kingbaseV8R3和postgreSQL哪个版本最接近?