当前位置:网站首页>大整数相加,相减,相乘,大整数与普通整数的相乘,相除
大整数相加,相减,相乘,大整数与普通整数的相乘,相除
2022-08-01 19:49:00 【疯疯癫癫才自由】
2)两个大整数相乘:
可以自行列两个小整数模拟一下,就可以理解代码:
/**
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); //调试一用
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) //如果第二位数已经算完了,得将剩余的余数一起存到num中
{
num.d[i+j+1]=r%10;
r=0;
}
}
}
while(num.len>1&&num.d[num.len-1]==0)
--num.len;
return num;
}
2)大整数相加,相减,大整数与普通整数的相乘,相除
/**
2)大整数相加,相减,大整数与普通整数的相乘,相除
*/
#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("输入两位大整数和一位正整数:\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");
}下面各自给出一个题目:当然,没有用上面的函数了,上面的函数实在《算法笔记》上学的,下面是在报 Acwing 的课程学的;思想都是一样的:
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;
}边栏推荐
- 如何看待腾讯云数据库负责人林晓斌借了一个亿炒股?
- Mobile Zero of Likou Brush Questions
- Pytorch模型训练实用教程学习笔记:一、数据加载和transforms方法总结
- 为什么限制了Oracle的SGA和PGA,OS仍然会用到SWAP?
- 安全作业7.25
- 58:第五章:开发admin管理服务:11:开发【管理员人脸登录,接口】;(未实测)(使用了阿里AI人脸识别)(演示了,使用RestTemplate实现接口调用接口;)
- Heavy cover special | intercept 99% malicious traffic, reveal WAF offensive and defensive drills best practices
- 不恰当Equatable协议==方法的实现对SwiftUI中@State修饰属性的影响
- Greenplum数据库源码分析——Standby Master操作工具分析
- 【ES】ES2021 我学不动了,这次只学 3 个。
猜你喜欢

第60章 ApplicationPart自动集成整体性和独立性插件项

第57章 业务逻辑之业务实体与数据库表的映射规则定义

Greenplum Database Source Code Analysis - Analysis of Standby Master Operation Tools

Combining two ordered arrays

MLX90640 Infrared Thermal Imager Temperature Measurement Module Development Notes (Complete)

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

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

Win11如何删除升级包?Win11删除升级包的方法

Win11怎么安装语音包?Win11语音包安装教程

明日盛会|ApacheCon Asia 2022 Pulsar 技术议题一览
随机推荐
nacos安装与配置
Gradle系列——Gradle文件操作,Gradle依赖(基于Gradle文档7.5)day3-1
Intranet penetration lanproxy deployment
57: Chapter 5: Develop admin management services: 10: Develop [get files from MongoDB's GridFS, interface]; (from GridFS, get the SOP of files) (Do not use MongoDB's service, you can exclude its autom
mysql自增ID跳跃增长解决方案
XSS靶场中级绕过
GBase 8c中怎么查询数据库配置参数,例如datestyle。使用什么函数或者语法呢?
环境变量,进程地址空间
Does LabVIEW really close the COM port using VISA Close?
How to query database configuration parameters in GBase 8c, such as datestyle.What function or syntax to use?
力扣刷题之合并两个有序数组
Win10, the middle mouse button cannot zoom in and out in proe/creo
openresty 动态黑白名单
Risc-v Process Attack
力扣刷题之移动零
Mobile Zero of Likou Brush Questions
1个小时!从零制作一个! AI图片识别WEB应用!
网络不通?服务丢包?这篇 TCP 连接状态详解及故障排查,收好了~
数据库系统原理与应用教程(072)—— MySQL 练习题:操作题 121-130(十六):综合练习
Creo5.0草绘如何绘制正六边形